|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
module scan (
|
module scan (
|
|
|
// Inputs & outputs to the chip
|
// Inputs & outputs to the chip
|
PERL begin
|
PERL begin
|
/*
|
/*
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
|
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
print " $signal_list[$i]{name},\n";
|
print " $signal_list[$i]{name},\n";
|
}
|
}
|
|
|
*/
|
*/
|
end
|
end
|
|
|
// To the pads
|
// To the pads
|
scan_phi,
|
scan_phi,
|
scan_phi_bar,
|
scan_phi_bar,
|
scan_data_in,
|
scan_data_in,
|
scan_data_out,
|
scan_data_out,
|
scan_load_chip,
|
scan_load_chip,
|
scan_load_chain
|
scan_load_chain
|
|
|
);
|
);
|
|
|
|
|
// /////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////
|
// Ports
|
// Ports
|
|
|
// Scans
|
// Scans
|
input scan_phi;
|
input scan_phi;
|
input scan_phi_bar;
|
input scan_phi_bar;
|
input scan_data_in;
|
input scan_data_in;
|
output scan_data_out;
|
output scan_data_out;
|
input scan_load_chain;
|
input scan_load_chain;
|
input scan_load_chip;
|
input scan_load_chip;
|
|
|
|
|
PERL begin
|
PERL begin
|
/*
|
/*
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
|
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
if ($signal_list[$i]{writable} == 1) {
|
if ($signal_list[$i]{writable} == 1) {
|
print " output reg ";
|
print " output reg ";
|
} else {
|
} else {
|
print " input ";
|
print " input ";
|
}
|
}
|
|
|
print "[$signal_list[$i]{size}-1:0] $signal_list[$i]{name};\n";
|
print "[$signal_list[$i]{size}-1:0] $signal_list[$i]{name};\n";
|
}
|
}
|
|
|
*/
|
*/
|
end
|
end
|
|
|
|
|
// /////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////
|
// Implementation
|
// Implementation
|
|
|
// The scan chain is comprised of two sets of latches: scan_master and scan_slave.
|
// The scan chain is comprised of two sets of latches: scan_master and scan_slave.
|
|
|
PERL begin
|
PERL begin
|
/*
|
/*
|
|
|
##############################################################
|
##############################################################
|
# Modify scan_signal_list.pl in order to change the signals. #
|
# Modify scan_signal_list.pl in order to change the signals. #
|
##############################################################
|
##############################################################
|
|
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
DEPERLIFY_INCLUDE(scan_signal_list.pl);
|
|
|
# Print scan chain latches
|
# Print scan chain latches
|
print " reg [$scan_chain_length-1:0] scan_master;\n";
|
print " reg [$scan_chain_length-1:0] scan_master;\n";
|
print " reg [$scan_chain_length-1:0] scan_slave;\n\n";
|
print " reg [$scan_chain_length-1:0] scan_slave;\n\n";
|
|
|
# Print scan_load and scan_next logic
|
# Print scan_load and scan_next logic
|
print " wire [$scan_chain_length-1:0] scan_load;\n";
|
print " wire [$scan_chain_length-1:0] scan_load;\n";
|
print " wire [$scan_chain_length-1:0] scan_next;\n\n";
|
print " wire [$scan_chain_length-1:0] scan_next;\n\n";
|
|
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
|
|
my $begin = $signal_list[$i]{start};
|
my $begin = $signal_list[$i]{start};
|
my $end = $signal_list[$i]{start} + $signal_list[$i]{size} - 1;
|
my $end = $signal_list[$i]{start} + $signal_list[$i]{size} - 1;
|
|
|
print " assign scan_load[$end:$begin] = " . $signal_list[$i]{name} . ";\n";
|
print " assign scan_load[$end:$begin] = " . $signal_list[$i]{name} . ";\n";
|
}
|
}
|
|
|
print "\n assign scan_next = scan_load_chain ? scan_load : {scan_data_in, scan_slave[$'$scan_chain_length-1:1]};\n\n";
|
print "\n assign scan_next = scan_load_chain ? scan_load : {scan_data_in, scan_slave[$'$scan_chain_length-1:1]};\n\n";
|
|
|
# Print latches
|
# Print latches
|
print " //synopsys one_hot \"scan_phi, scan_phi_bar\"\n";
|
print " //synopsys one_hot \"scan_phi, scan_phi_bar\"\n";
|
print " always @ (*) begin\n";
|
print " always @ (*) begin\n";
|
print " if (scan_phi)\n";
|
print " if (scan_phi)\n";
|
print " scan_master = scan_next;\n";
|
print " scan_master = scan_next;\n";
|
print " if (scan_phi_bar)\n";
|
print " if (scan_phi_bar)\n";
|
print " scan_slave = scan_master;\n";
|
print " scan_slave = scan_master;\n";
|
print " end\n\n";
|
print " end\n\n";
|
|
|
# Print input latches
|
# Print input latches
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
for (my $i = 0; $i < scalar @signal_list; $i++) {
|
if ($signal_list[$i]{writable} == 1) {
|
if ($signal_list[$i]{writable} == 1) {
|
my $begin = $signal_list[$i]{start};
|
my $begin = $signal_list[$i]{start};
|
my $end = $signal_list[$i]{start} + $signal_list[$i]{size} - 1;
|
my $end = $signal_list[$i]{start} + $signal_list[$i]{size} - 1;
|
my $name = $signal_list[$i]{name};
|
my $name = $signal_list[$i]{name};
|
print " always @ (*) if (scan_load_chip) $name = scan_slave[$end:$begin];\n";
|
print " always @ (*) if (scan_load_chip) $name = scan_slave[$end:$begin];\n";
|
}
|
}
|
}
|
}
|
|
|
# Print data_out
|
# Print data_out
|
print " assign scan_data_out = scan_slave[0];\n";
|
print " assign scan_data_out = scan_slave[0];\n";
|
|
|
*/
|
*/
|
end
|
end
|
|
|
|
|
// /////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////
|
|
|
endmodule
|
endmodule
|
|
|