// Verilog HDL for "mylib", "fifo256_sim" "functional"
module fifo256_sim ;
wire [7:0] data;
reg [7:0] idata;
wire oflow, empty;
reg ce, we;
reg clk, reset;
reg bistmode;
wire bistout;
fifo256 fio( .data(data),
.ce(ce), .we(we), .oflow(oflow), .empty(empty),
.clk(clk), .reset(reset),
.bistmode(bistmode), .bistout(bistout) );
initial begin
clk = 0;
forever #500 clk = ~clk;
end
assign data = (we == 1 && ce == 1) ? idata : 32'bz;
initial begin
idata = 8'hFF;
forever @(posedge clk)
if( we == 1 && ce == 1 ) idata <= #50 idata - 1;
end
initial begin:main_loop
integer i;
reset = 0;
ce = 0;
we = 0;
bistmode = 0;
#600 reset = 1;
#1000 reset = 0;
@( posedge clk ) #50 we = 1; ce = 1;
for( i=0; i<3; i=i+1 ) @(posedge clk);
#50 we = 0; ce = 0;
@( posedge clk );
@( posedge clk ) #50 we = 0; ce = 1;
for( i=0; i<3; i=i+1 ) @(posedge clk);
#50 ce = 0;
@( posedge clk );
@( posedge clk ) #50 we = 1; ce = 1;
for( i=0; i<256; i=i+1 ) @(posedge clk);
#50 we = 0; ce = 0;
@( posedge clk );
@( posedge clk ) #50 we = 0; ce = 1;
for( i=0; i<256; i=i+1 ) @(posedge clk);
#50 we = 0; ce = 0;
for( i=0; i<3; i=i+1 ) @(posedge clk);
$finish;
end
initial begin
$dumpfile("fifo256_sim.vcd");
$dumpvars(1,fio);
end
endmodule
Eine Zeiteinheit sind 100 ps, bzw. 0.1 ns.
Die Referenz der Ports muß explizit
über den Namen erfolgen, da die Reihenfolge der Ports in den
Netzlisten von Schaltplänen nicht gewährleistet ist.
Die Port-Syntax ist:
.portname(angeschlossenes Netz)Erlauben Sie Cadence, ein Symbol für das Simulationsmodul zu erzeugen, da Sie sonst regelmäßig danach gefragt werden.
Beachten Sie bitte den $dumpfile/$dumpvars-Block. Mit diesen Befehlen wird ein sog. `Value Change Dump File' (VCD) erzeugt (Kapitel 20 des Verilog-Referenzhandbuchs). Hier im Beispiel werden alle Variablen der FIFO-Instanz fio gespeichert.
Ein VCD ist handlicher als die Standardmethode, und damit wird ein sehr lästiger Fehler bei der Simulation umgangen. Noch besser ist natürlich die Verwendung der $shm_open/$shm_probe-Funktionen. Leider sind diese nur sehr schlecht dokumentiert (Dokumentations-Bug), und der Syntax-Check nach dem Editieren des Simulations-functionals findet Syntaxfehler, wo keine sind.
Wenn die zu simulierende Schaltung kein functional besitzt, aus dem man den Modul-Header ablesen kann, kann man sich temporär aus dem Symbol oder Schaltplan ein solches functional erzeugen. Man öffnet dazu den Symbol- oder Schematic View und führt folgende Schritte aus:
Menu> Design -> Create Cellview -> From Cellview Menu> To View Name -> functional Button> Edit Options -> Off Button> OKDas erzeugte functional besteht nur aus dem Header.