next up previous contents
Next: Durchführung der Simulation Up: Simulation Previous: Simulation

Simulationsmodul

Ein intelligenter Weg, eine Simulationsumgebung bereitzustellen, ist, eine eigene Zelle für die Simulation zu erzeugen. Dies ist kein Muß, hat sich aber als günstiger erwiesen. Wenn die Simulations-Stimuli in den Simulationsverzeichnissen gehalten werden, geht schnell die Übersicht verloren und unbeabsichtigtes Löschen oder Überschreiben droht. Man erzeuge zunächst den Functional View einer neuen Zelle, z.B. mit dem Namen fifo256_sim, eventuell sogar in einer neuen Bibliothek, füge eine Instanz der zu simulierenden Schaltung ein, und ergänze die Simulationsprozesse. Dies ist ein Beispiel für fifo256_sim:
// 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>   OK
Das erzeugte functional besteht nur aus dem Header.
next up previous contents
Next: Durchführung der Simulation Up: Simulation Previous: Simulation
Thilo Thiessenhusen
16. 4. 1999