URL
https://opencores.org/ocsvn/socgen/socgen/trunk
Subversion Repositories socgen
Compare Revisions
- This comparison shows the changes necessary to convert path
/socgen/trunk/doc/src/guides
- from Rev 20 to Rev 27
- ↔ Reverse comparison
Rev 20 → Rev 27
/guide_verification.html
0,0 → 1,1297
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
<html> |
<head> |
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"> |
<title>Verification Guidelines</title> |
<meta name="GENERATOR" content="OpenOffice.org 3.0 (Linux)"> |
<meta name="CREATED" content="0;0"> |
<meta name="CHANGED" content="20100309;9312200"> |
<meta name="KEYWORDS" content="start"> |
<meta name="Info 3" content=""> |
<meta name="Info 4" content=""> |
<meta name="date" content="2008-01-08T12:01:41-0500"> |
<meta name="robots" content="index,follow"> |
</head> |
<body dir="ltr" lang="en-US"> |
<h1><a name="socgen_project"></a><big>SOCGEN Project</big></h1> |
<h2><br> |
</h2> |
<h2><a name="manifesto"></a>Verification Guidelines</h2> |
<p><br> |
<br> |
</p> |
<p>Verification is the art of stimulating a component |
module and checking that it produces the correct outputs. Stimulations |
are designed to |
ensure that all of the components functions are exercised and any |
deviation from the expected value is reported as an error. Every |
component must have at least one test case but may have as many as |
needed to fully verify the design.<br> |
</p> |
<p>A complete test suite is required for every component module. |
Each test_case is simulated and the log file will indicate whether the |
test passed or failed. Other output files such as dump files may also |
be produced duging the simulation.<br> |
</p> |
<p><br> |
</p> |
<p></p> |
<br> |
<p><img style="width: 800px; height: 600px;" alt="" |
src="../png/ver_fig1.png"><br> |
</p> |
<p><br> |
</p> |
<p>A test suite is needed for every piece of IP in the design and |
creating this suite can be a very labor intensive operation. It usually |
takes four hours to create the test_cases for each hour that was spent |
creating the rtl code. A full test must be run on every leaf cell |
component and some of these are repeated as the components are used as |
children of other components. It is essential that all test_cases |
are written so that they may be reused when testing the component when |
it it part of a parent component.<br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><img style="width: 800px; height: 600px;" alt="" |
src="../png/ver_fig2.png"><br> |
</p> |
<p>In this case a new component is created by combining two leaf |
cell components and its test_case is created by combining blocks from |
those two components test_cases.<br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
</p> |
<p><img style="width: 800px; height: 600px;" alt="" |
src="../png/ver_fig3.png"><br> |
</p> |
<p><br> |
</p> |
<p>Every interface on the component is connected to it's own bfm model |
that contains all the tasks needed to test the interface. The calling |
sequences needed to preform a particular test are all loaded from a |
sperate file. It is important that each interface has its task calls in |
a seperate code block. The goal is to develope these models and task |
calls on the component simulation and then reuse them as the |
component is used in larger designs. Interleaving task calls for |
different models makes that difficult.<br> |
</p> |
<p><br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>guidelines for creating reusable test_cases<br> |
</h2> |
<br> |
All test_cases will have a master clock and reset signal. |
The DUT and all models will respond to the reset signal. Anything in |
test_define will only change state on the rising edge of clock.<br |
style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> All test_cases will be |
self-checking. Test suites are usually run by scripts and robots |
that need a simple method to determine wether a test_case finished and |
passed. </span><br style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> All models, tasks and protocal |
checkers will use a common method to report if there is a failure.</span><br |
style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> All test sequences will use a |
common method to signal the successful completion of the test</span><br |
style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> All messages in the log file |
must use the following format:</span><br> |
<br style="font-family: serif;"> |
<ul style="font-family: monospace;"> |
<li><big>Time stamp This is the |
$realtime formated by %t</big></li> |
<li><big>Instance Name This is obtained with |
%m</big></li> |
<li><big>Message Type This is either |
ERROR or WARNING. No type indicates informational message</big></li> |
<li><big>Message |
|
|
</big><br> |
</li> |
</ul> |
<br style="font-family: serif;"> |
<br style="font-family: serif;"> |
<p style="font-family: serif;"> All test cases MUST have a |
finite run time. Use a TIMEOUT counter to stop the sim if it |
exceeds the expected number of clocks<br style="font-family: serif;"> |
</p> |
<span style="font-family: serif;"> |
<code><span style="font-family: serif;">All test_cases must be |
deterministic. If any pseudorandom delays are used they must be |
"seeded" and repeatable from run to run.</span></code></span><code |
style="font-family: serif;"><br> |
<br> |
<br> |
<span style="font-family: serif;"> </span></code><span |
style="font-family: serif;"><code><span style="font-family: serif;">Do |
not interweave threads in the test_define blocks. Each block should |
only access a single BFM.</span><br style="font-family: serif;"> |
<br style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> Plan on designs where you will |
need to test multiple instances of a component</span><br |
style="font-family: serif;"> |
<br style="font-family: serif;"> |
<span style="font-family: serif;"> Only test a single |
configuration or mode in any test_case. If you need to test 3 different |
modes then create 3 different test_cases. The exception to this is when |
there is a mission mode requirement to switch modes and you are testing |
that switch. </span><br style="font-family: serif;"> |
</code></span> |
<p style="font-family: serif;"><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>simulation directory (sim)<br> |
</h2> |
<p><br> |
</p> |
<big><code> |
./sim<br> |
+/bin<br> |
Makefile<br> |
+/bench<br> |
+verilog<br> |
TestBench<br> |
+models<br> |
model1<br> |
model2<br> |
.<br> |
.<br> |
.<br> |
+/lib<br> |
+lib_part1<br> |
lib_part(s).v<br> |
+lib_part2<br> |
.<br> |
.<br> |
.<br> |
</code><code> +/run</code><br> |
<code> +test_case1<br> |
filelist<br> |
dmp_define<br> |
modellist<br> |
dut<br> |
test_define<br> |
liblist<br> |
TB.defs<br> |
+test_case2<br> |
.<br> |
.<br> |
.<br> |
+/log<br> |
test_case1.log<br> |
test_case2.log<br> |
.<br> |
.<br> |
.<br> |
+/out<br> |
</code><code> test_case1.vcd<br> |
test_case2.vcd<br> |
.<br> |
.<br> |
.</code><br> |
</big> |
<code><ouabache design="" works=""><big><br> |
<br> |
<br> |
</big> |
<br> |
</ouabache></code> |
<p>Each component will have a ./sim directory for the test suite. |
Typing:<br> |
</p> |
<p><big><big><br> |
<small><span style="font-family: monospace;"> |
<>:~$>cd ./sim/bin</span><br style="font-family: monospace;"> |
</small><span style="font-family: monospace;"><small> |
<>:~$>make run_sims</small><br> |
</span></big></big></p> |
<p><big><big><span style="font-family: monospace;"><br> |
</span></big></big> |
</p> |
will run the entire test suite. After that has been done then |
individual test_cases may be rerun by changing into their test_case |
directory and typing:<br> |
<code><ouabache design="" works=""><br> |
<br> |
</ouabache></code> |
<p><big><big><span style="font-family: monospace;"><small><>:~$>make |
sim</small></span></big></big> |
</p> |
<p><br> |
</p> |
<p>Each test_case will produce a log file that may be parsed for the |
string "PASSED" to indicate that the sim finished. If so then the log |
file should be parsed for the strings "ERROR" and "WARNING" to see if |
there were and errors or warnings. <br> |
</p> |
<p>Simulating a test_case requires involking a verilog simulator and |
passing it command line arguments and a TestBench file. Icarus verilog |
is the default simulator for the socgen project. Socgen uses a minumal |
command line and instead puts most needed information in the TestBench |
file. The only command line option is to set the VCD flag if a |
value change dump file is needed.<br> |
</p> |
<p><br> |
</p> |
<p><br> |
<br> |
<br> |
<br> |
<br> |
</p> |
<h2><a name="manifesto"></a>TestBench file<br> |
</h2> |
<code> |
<ouabache design="" works="">--------------------------------------------------------------------------------------------------------------------------------------<br> |
<br> |
`include "./TB.defs"<br> |
<br> |
`ifndef TIMESCALE<br> |
`define TIMESCALE 1ns/1ns<br> |
`endif<br> |
<br> |
<br> |
`ifndef TIMEFORMAT<br> |
`define TIMEFORMAT $timeformat(-6, 2, " |
us", 14);<br> |
`endif<br> |
<br> |
<br> |
`ifndef PERIOD<br> |
`define PERIOD |
40.00000 <br> |
`endif<br> |
<br> |
`ifndef TIMEOUT<br> |
`define TIMEOUT 200000<br> |
`endif<br> |
<br> |
<br> |
`timescale `TIMESCALE<br> |
<br> |
<br> |
`include "./filelist"<br> |
`include "./liblist"<br> |
`include "./modellist"<br> |
<br> |
<br> |
<br> |
<br> |
module TB();<br> |
<br> |
wire clk;<br> |
wire reset;<br> |
<br> |
`include "./dut"<br> |
`include "./test_define"<br> |
<br> |
<br> |
`ifdef VCD<br> |
initial<br> |
begin<br> |
`include "./dmp_define"<br> |
end<br> |
`endif<br> |
<br> |
clock_gen<br> |
#(.PERIOD(`PERIOD),<br> |
.TIMEOUT(`TIMEOUT))<br> |
cg <br> |
( .clk ( clk ),<br> |
|
.reset ( reset )<br> |
);<br> |
<br> |
<br> |
<br> |
<br> |
endmodule<br> |
</ouabache></code><span style="font-family: monospace;"><br> |
--------------------------------------------------------------------------------------------------------------------------------------<br> |
</span> |
<p><span style="font-family: monospace;"><br> |
</span></p> |
<p><br> |
<span style="font-family: monospace;"></span></p> |
<p>A single TestBench file provides the infrastructure for all |
test cases. The actual testing is determined by the data contained in |
six files in the ./sim/run/test_case directory. The TestBench file |
creates a top level module named TB and instantiates a clock_reset |
generator module to provide each test_case with a clock and a reset |
signal. It also provides a vcd dump and timeout functions |
for each test_case.<span style="font-family: monospace;"><br> |
</span></p> |
<p><span style="font-family: monospace;"><br> |
</span></p> |
<p><span style="font-family: monospace;"><br> |
</span></p> |
<h2><a name="manifesto"></a>TB.defs <br> |
</h2> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span> |
</p> |
<code> |
`define TIMESCALE 1ns/1ns<br> |
`define TIMEFORMAT $timeformat(-6, 2, " |
us", 14);<br> |
`define PERIOD |
40.0000 <br> |
`define TIMEOUT 200000<br> |
</code> |
<p></p> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------<br> |
</span></p> |
<p><span style="font-family: monospace;"><br> |
</span></p> |
<p>The TB.defs file may be used to set up the timescale and master |
clock period for the simulation. Any model or lib part that needs |
to reset the timescale back to the system default must use:<br> |
</p> |
<p><code>`timescale `TIMESCALE<br> |
</code></p> |
<p><code><br> |
<span style="font-family: serif;">Do NOT use</span><br> |
</code></p> |
<p><code>`include "./timescale.v"<br> |
</code></p> |
<p><code><br> |
<span style="font-family: serif;">The socgen project does not contain |
any timescale.v file. All socgen rtl code is preprocessed before |
it is passed to simulation and the value of the timescale may change |
depending on the simulation. All ip components must only contain |
synthesisable code and should not have any need for timescale.<br> |
</span></code></p> |
<p><code><span style="font-family: serif;">TIMEFORMAT will set the |
format that is used when time is displayed using the %t format . All |
$display statements must start by displaying $realtime using the %t |
format so every line in the log has a time stamp. Any display statement |
from an instantiated module must also have %m to print out it's |
instance name. If the message is an error or a warning then the strings |
ERROR or WARNING must be used so that this information may be parsed |
from the log file.<br> |
<br style="font-family: serif;"> |
</span></code></p> |
<p><span style="font-family: monospace;"><br> |
</span>The TB.defs file may also |
be used to pass the size and location of an embedded bit |
file to the device_under_test<span style="font-family: monospace;"> <br> |
</span></p> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span></p> |
<p><span style="font-family: monospace;">`define ROM_WORDS 2048 <br> |
`define ROM_ADDR 11 <br> |
`define ROM_WIDTH 12 <br> |
`define ROM_FILE "../../../../../sw/mouse/mouse.abs12"<br> |
</span><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span><br> |
</p> |
<p>The path is the relative path from the test_case run directory.<span |
style="font-family: monospace;"><br> |
</span></p> |
<p><span style="font-family: monospace;"><br> |
</span></p> |
<h2><a name="manifesto"></a>filelist </h2> |
<p style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------<br> |
</p> |
<p style="font-family: monospace;">`include |
"../../../rtl/gen/sim/soc_mouse.v"<br> |
`include "../../../../pic16c5x/rtl/gen/sim/pic16c5x.v"<br> |
`include |
"../../../../../children/logic/ip/io_module/rtl/gen/sim/io_module_mouse.v"<br> |
`include |
"../../../../../children/logic/ip/ps2_interface/rtl/gen/sim/ps2_interface.v"<br> |
`include "../../../../../children/logic/ip/uart/rtl/gen/sim/uart.v"<br> |
</p> |
<code style="font-family: monospace;"></code> |
<span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span> |
<p><br> |
</p> |
<p>The filelist uses `include statements to load all the rtl files into |
the simulation.The paths are relative from the test_case run |
directory. Note that all the verilog files have been post-processed and |
search directories or include directories are not needed. |
</p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>liblist</h2> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span> |
</p> |
<code> |
<br> |
`include "../../lib/cde_sram/cde_sram.v"<br> |
`include "../../lib/cde_lifo/cde_lifo.v"<br> |
`include "../../lib/cde_synchronizers/cde_sync_with_hysteresis.v"<br> |
<br> |
</code> |
<span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span><br> |
<p>The liblist uses `include statements to load all the generic lib |
models into |
the simulation.The paths are relative from the test_case run |
directory. Note that these libs may be replaced by vendor |
specific instances when the design is synthesised into gates.<br> |
</p> |
<p><br> |
</p> |
<p></p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>modellist</h2> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span> |
</p> |
<code><br> |
`include "../../bench/verilog/models/clock_gen.v"<br> |
`include "../../bench/verilog/models/ps2_model.v" <br> |
`include "../../bench/verilog/models/iobuftri.v" <br> |
</code><span style="font-family: monospace;"></span><code><br> |
</code> |
<span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span><br> |
<br> |
This list loads all of the simulation models used in the simulation.<br> |
<br> |
<p><br> |
<br> |
</p> |
<h2><a name="manifesto"></a>dut<br> |
</h2> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span></p> |
<p><code>reg |
device_write;<br> |
reg [7:0] device_tx_data;<br> |
reg device_parity;<br> |
reg device_ack;<br> |
reg device_stop;<br> |
wire device_rx_read;<br> |
wire [7:0] device_rx_data;<br> |
wire device_rx_parity;<br> |
wire ps2_data_pad_oe;<br> |
wire ps2_data_pad_in;<br> |
wire ps2_data;<br> |
wire ps2_clk_pad_oe;<br> |
wire ps2_clk_pad_in;<br> |
wire ps2_clk;<br> |
<br> |
<br> |
<br> |
wire [7:0] portaout;<br> |
wire [7:0] portbout;<br> |
wire [7:0] portcout;<br> |
<br> |
<br> |
wire [9:0] y_pos;<br> |
wire [9:0] x_pos;<br> |
wire |
new_packet;<br> |
wire |
ms_mid; <br> |
wire |
ms_right; <br> |
wire |
ms_left; <br> |
<br> |
<br> |
<br> |
wire |
txd_pad_out;<br> |
wire |
rxd_pad_in;<br> |
wire |
cts_pad_in;<br> |
wire |
rts_pad_out; <br> |
<br> |
<br> |
// Instantiate one CPU to be tested.<br> |
soc_mouse<br> |
#(<br> |
.ROM_WORDS ( `ROM_WORDS ), <br> |
.ROM_ADDR ( `ROM_ADDR ), <br> |
.ROM_WIDTH ( `ROM_WIDTH ), <br> |
.ROM_FILE ( `ROM_FILE )<br> |
)<br> |
dut(<br> |
.clk ( |
clk ),<br> |
.reset ( |
reset ),<br> |
<br> |
.ps2_data_pad_in ( ps2_data_pad_in ),<br> |
.ps2_clk_pad_in ( ps2_clk_pad_in ),<br> |
<br> |
.ps2_data_pad_oe ( ps2_data_pad_oe ),<br> |
.ps2_clk_pad_oe ( ps2_clk_pad_oe ),<br> |
<br> |
<br> |
.portaout ( portaout ),<br> |
.portbout ( portbout ),<br> |
.portcout ( portcout ),<br> |
<br> |
<br> |
.y_pos ( |
y_pos ),<br> |
.x_pos ( |
x_pos ),<br> |
.new_packet ( new_packet ),<br> |
.ms_mid ( |
ms_mid ), <br> |
.ms_right ( ms_right |
), <br> |
.ms_left ( |
ms_left ), <br> |
<br> |
<br> |
<br> |
.txd_pad_out ( loop1 ),<br> |
.rxd_pad_in ( |
loop1 ),<br> |
.cts_pad_in ( |
loop2 ),<br> |
.rts_pad_out ( loop2 |
) <br> |
<br> |
);<br> |
<br> |
<br> |
iobuftri<br> |
data_tri_buf<br> |
(<br> |
.i ( |
1'b0 ),<br> |
.oe ( ps2_data_pad_oe ),<br> |
.o ( ps2_data_pad_in ),<br> |
.pad ( ps2_data )<br> |
);<br> |
<br> |
<br> |
iobuftri<br> |
clk_tri_buf<br> |
(<br> |
.i ( 1'b0 |
),<br> |
.oe ( ps2_clk_pad_oe ),<br> |
.o ( ps2_clk_pad_in ),<br> |
.pad ( ps2_clk )<br> |
);<br> |
<br> |
<br> |
<br> |
pullup ua0(ps2_clk);<br> |
pullup ua1(ps2_data);<br> |
<br> |
<br> |
ps2_model <br> |
#(.CLKCNT(10'h177))<br> |
ps2<br> |
(<br> |
|
.clk |
( |
clk |
),<br> |
|
.reset |
( |
reset |
), |
<br> |
|
.send |
( |
device_write |
),<br> |
|
.send_data |
( |
device_tx_data |
),<br> |
|
.device_parity ( |
device_parity ),<br> |
|
.device_ack |
( |
device_ack |
),<br> |
|
.device_stop |
( |
device_stop |
),<br> |
|
.device_rx_read ( |
device_rx_read ),<br> |
|
.device_rx_data ( |
device_rx_data ),<br> |
.device_rx_parity ( |
device_rx_parity ),<br> |
<br> |
|
.ps2_clk |
( |
ps2_clk |
),<br> |
|
.ps2_data |
( |
ps2_data |
)<br> |
<br> |
);<br> |
</code><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span><br> |
</p> |
<p>This file is a verilog code segment that declares all the wires and |
regs needed in the sim (except for clk and reset). It then |
instantiates the component and all needed models for the simulation.<br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>test_define<br> |
</h2> |
<p><span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span></p> |
<p><br> |
</p> |
<p><span style="font-family: monospace;">initial</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">begin</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;"> `TIMEFORMAT</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">$display(" |
");</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">$display(" |
===================================================");</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">$display(" |
Test |
Start");</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">$display(" |
===================================================");</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">$display(" |
");</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h00;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_ack |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_stop |
= |
1'b1;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.reset_off;</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'haa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h00;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h03;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">while (device_rx_read == 1'b0 ) |
cg.next(1);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(2000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hfa;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h12;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h34;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h56;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h78;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b0;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'h9a;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_parity |
= 1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">device_tx_data |
= 8'hbc;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b1;</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(1);</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">device_write |
= |
1'b0;</span><br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">cg.next(20000);</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<span style="font-family: monospace;">$display("%t |
Test PASSED",$realtime);</span><br style="font-family: monospace;"> |
<span style="font-family: monospace;">$finish;</span><br |
style="font-family: monospace;"> |
<span style="font-family: monospace;">end</span><br |
style="font-family: monospace;"> |
<br style="font-family: monospace;"> |
<br> |
</p> |
<p><br> |
</p> |
<p><br> |
<span style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------</span><br> |
</p> |
<p><br> |
</p> |
<h2><a name="manifesto"></a>dmp_define<br> |
</h2> |
<p style="font-family: monospace;">--------------------------------------------------------------------------------------------------------------------------------------<br> |
</p> |
<p style="font-family: monospace;">$dumpfile ("TestBench.vcd");<br> |
$dumpvars (0, TB);<br> |
--------------------------------------------------------------------------------------------------------------------------------------<br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p><br> |
</p> |
<p>This is a test<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
<p><br> |
<br> |
</p> |
</body> |
</html> |
/guide_database.html
2,7 → 2,7
<html> |
<head> |
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"> |
<title>start</title> |
<title>Design Database Management</title> |
<meta name="GENERATOR" content="OpenOffice.org 3.0 (Linux)"> |
<meta name="CREATED" content="0;0"> |
<meta name="CHANGED" content="20100309;9302100"> |
/guide_documentation.html
2,7 → 2,7
<html> |
<head> |
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"> |
<title>start</title> |
<title>Documentation Guidelines</title> |
<meta name="GENERATOR" content="OpenOffice.org 3.0 (Linux)"> |
<meta name="CREATED" content="0;0"> |
<meta name="CHANGED" content="20100309;9322200"> |
/reset_sys_design.html
1,8 → 1,8
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
<html> |
<head> |
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8"> |
<title>start</title> |
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=UTF-8"> |
<title>Reset System Design</title> |
<meta name="GENERATOR" content="OpenOffice.org 3.0 (Linux)"> |
<meta name="CREATED" content="0;0"> |
<meta name="CHANGED" content="20100309;9305300"> |
79,7 → 79,7
<p>You do not need a power on reset system for your logic to work. You |
need it in order to verify that your logic works. It takes |
longer to verify a design than it does to create it and not providing a |
100% known startup condition will make the verification effort that |
100% known start up condition will make the verification effort that |
much harder. All storage elements must be on a reset if only for test |
and verification purposes. If you have logic that must function during |
a power up reset then put it on a special reset that is only active in |
89,7 → 89,7
<h3 class="western">All components must come out of reset on exactly |
the same clock<br> |
</h3> |
Thats true, or at least it was back in the 60's. Back then every |
That's true, or at least it was back in the 60's. Back then every |
component would come out of reset and start "componenting". The reset |
system acted like a conductor so that everybody started on the |
same beat. Those types of systems are rare today. Most major chips have |
128,7 → 128,7
<h3 class="western">You must design your logic using synchronous design |
methods<br> |
</h3> |
Absolutely. Todays chips are huge. The only way that you can close |
Absolutely. Today's chips are huge. The only way that you can close |
timing on a large design is if everyone follows strict synchronous |
design rules. The mistake that many of todays designers make is |
that they think that because they have to design an asynchronous reset |
152,7 → 152,7
signals crossing between the async reset port on a flipflop and |
either a D or a Q port then it flags it as a violation. So you can |
either send it back to the customer and wait a week for them to find |
it, fix it, and resynthesizes or you can eco in a test mux at the flop |
it, fix it, and re-synthesizes or you can eco in a test mux at the flop |
and have it fixed in 5 minutes. Everyone took the easy way out.<br> |
<br> |
But then along came Logic equivalence checking (LEC). The final |
220,7 → 220,8
value and it can't. There are also times when it will resolve an |
X to a known value when it shouldn't. The only way to use verilog is to |
start with everything in a known state and stop it when anything goes |
X. That means theres a problem and nothing downstream from that X |
X. That means there's a problem and nothing downstream from that |
X |
can be trusted.<br> |
<br> |
<br> |
227,7 → 228,7
You do not prove your reset system design in gates sims. You prove the |
design in rtl sims and use LEC to prove that gates matches the design |
that works. Then you use initial statements to force all flops to |
a known state at startup and use gates sims to prove that everything |
a known state at start up and use gates sims to prove that everything |
else works. Verilog gates is the wrong tool to use to verify the reset |
system.<br> |
<br> |
275,7 → 276,7
system clock that is measured in the nanoseconds. Performing a reset in |
one clock cycle requires adding logic to every single flipflop<br> |
for no good reason. A designer should only add reset logic as a last |
resort. The prefered method is to use the existing mission mode logic |
resort. The preferred method is to use the existing mission mode logic |
to perform the reset. If you have a computational block with a fifty |
stage deep pipeline then reset should force it's inputs to 0 and open |
all the gates so that every flipflop will be flushed out in 50 clocks. |
334,7 → 335,7
enough period of time</li> |
</ul> |
<ul> |
<li>The design has a soft reset block that can reset any subblock if |
<li>The design has a soft reset block that can reset any sub block if |
its reset flop is set to 1.</li> |
</ul> |
<ul> |
350,7 → 351,7
</li> |
</ul> |
The last is important because some designers will forget that the |
filtered output is actually it's own seperate reset domain<br> |
filtered output is actually it's own separate reset domain<br> |
<br> |
<br> |
<br> |
385,7 → 386,8
<li>an active low on the output of the metastable filter</li> |
</ul> |
<br> |
The jtag reset is not included because it doesnt reset the timer. |
The jtag reset is not included because it doesn't reset the |
timer. |
Once this step is complete it will provide a map for the reset |
distribution tree that you will need. The best way to distribute the |
reset over a large design is to use what is called a "synchronous reset |
411,14 → 413,28
<br> |
<br> |
<br> |
<h3 class="western">6) Select reset style for each flip/flop<br> |
</h3> |
We now need to select a reset "Style" for each flip/flop from the four |
possible reset styles.<br> |
<br> |
<br> |
<ul> |
<li>Synchronous</li> |
<li>Synchronous with output override</li> |
<li>Asynchronous</li> |
<li>Both Synchronous and Asynchronous</li> |
</ul> |
<br> |
If the reset system is synchronous then you may choose any of the four |
styles. If it is asynchronous then you cannot use the synchronous style.<br> |
<br> |
<br> |
<br> |
<br> |
<br> |
<img style="width: 800px; height: 600px;" alt="" |
src="../png/reset_fig1.png"><br> |
<br> |
<br> |
<br> |
427,8 → 443,32
<br> |
<br> |
<br> |
<h3 class="western">7) Apply DFT fixes to all asynchronous ports<br> |
</h3> |
All paths from the Q output of a flip/flop to the asynchronous |
reset/preset port of a flip/flop must be disabled during scan testing. |
The use of a test mux to do this is not recommended because anytime you |
use a test mux you are not testing the circuit as it is used in mission |
mode. There will always be at least one point of failure inside the |
test mux where scan tests will pass but the IC will not function.<br> |
<br> |
The recommended method is to gate off the synchronous path with a atg |
test signal and then recombine it with an asynchronous reset so that |
the async reset it self is still testable. The lib module |
cde_asyncdisable is available for this purpose. DO NOT CREATE YOUR OWN |
TEST LOGIC. Checking the rtl code to ensure that all asynchronous |
resets are testable requires a fairly sophisticated and expensive tool. |
Checking the rtl to ensure that all asynchronous resets are properly |
connected to a cde_asyncdisable module takes a simple perl script.<br> |
<br> |
<br> |
<br> |
<br> |
<br> |
<br> |
<img style="width: 800px; height: 600px;" alt="" |
src="../png/reset_fig2.png"><br> |
<br> |
<p><br> |
<br> |
</p> |