2016-03-27 11 views
1

Ich behebe einige Probleme des Quellcodes unten. Ich erstelle Orakel, die den Erwartungswert mit dem tatsächlichen Wert vergleichen, den ich bekomme. der erwartete Wert, den ich zu berechnen versuche, ist Variable "e". und der tatsächliche Wert, den ich bekomme, ist Variable 'z'.Verilog Oracle, erwarteter Wert funktioniert nicht richtig

also, Variable 'ok' sollte '1' sein, wenn 'e === z'. Aber es setzt 'ok' nicht auf '1', auch wenn '= z' wahr ist.

Hier ist der Quellcode.

module lab9; 
reg [31:0] d; 
reg clk, enable, flag; 
wire [31:0] z; 
reg [31:0] e,ok; 
register #(32) mine(z, d, clk, enable); 


always begin 

#1 clk = ~clk; 
end 

initial 
$monitor("%5d: clk=%b,d=%d,z=%d,expect=%d, ok=%d", $time,clk,d,z, e, ok); 

initial begin 
clk=0; 

flag = $value$plusargs("enable=%b", enable); 

repeat (20) begin 

#2 d = $random; 
e=d; 

if(e === z) 
ok = 1; 
else 
ok = 0; 

end 

$finish; 

end 
endmodule 

Und hier ist Beispielausgabe

0: clk=0,d=   x,z=   x,expect=   x, ok=   x 
1: clk=1,d=   x,z=   x,expect=   x, ok=   x 
    2: clk=0,d= 303379748,z=   x,expect= 303379748, ok=   0 
    3: clk=1,d= 303379748,z= 303379748,expect= 303379748, ok=   0 
    4: clk=0,d=3230228097,z= 303379748,expect=3230228097, ok=   0 
    5: clk=1,d=3230228097,z=3230228097,expect=3230228097, ok=   0 
    6: clk=0,d=2223298057,z=3230228097,expect=2223298057, ok=   0 
    7: clk=1,d=2223298057,z=2223298057,expect=2223298057, ok=   0 
    8: clk=0,d=2985317987,z=2223298057,expect=2985317987, ok=   0 
    9: clk=1,d=2985317987,z=2985317987,expect=2985317987, ok=   0 
    10: clk=0,d= 112818957,z=2985317987,expect= 112818957, ok=   0 
    11: clk=1,d= 112818957,z= 112818957,expect= 112818957, ok=   0 
    12: clk=0,d=1189058957,z= 112818957,expect=1189058957, ok=   0 
    13: clk=1,d=1189058957,z=1189058957,expect=1189058957, ok=   0 
    14: clk=0,d=2999092325,z=1189058957,expect=2999092325, ok=   0 
    15: clk=1,d=2999092325,z=2999092325,expect=2999092325, ok=   0 
    16: clk=0,d=2302104082,z=2999092325,expect=2302104082, ok=   0 
    17: clk=1,d=2302104082,z=2302104082,expect=2302104082, ok=   0 
    18: clk=0,d= 15983361,z=2302104082,expect= 15983361, ok=   0 
    19: clk=1,d= 15983361,z= 15983361,expect= 15983361, ok=   0 
    20: clk=0,d= 114806029,z= 15983361,expect= 114806029, ok=   0 

Wie Sie sehen, es zeigt, dass einige von ihnen gleichen ‚z‘ haben und Werte ‚erwarten‘. Aber 'ok' immer auf '0' gesetzt. Selbst wenn ich es so codiert habe, dass es sich auf 1 setzt, wenn sie gleich sind.

Das ist, was ich nicht weiß. Bitte hilf mir, danke.

Antwort

2

Es ist schwierig, sicher zu sein, weil Sie den Code für register nicht bereitstellen können. Ich vermute jedoch, dass Sie ein Planungsproblem haben. Verilog hat 4 Scheduling Regionen:

from prev time step 
     | 
     ACTIVE 
     | 
    INACTIVE 
     | 
     NBA 
     | 
    POSTPONED 
     | 
     V 
to next time step 

Diese Linie wird im aktiven Bereich ausgeführt werden:

e=d; 

z ist wahrscheinlich in der NBA Region aktualisiert werden (ich kann nicht sicher sein, ohne den Code, aber wenn register ist einige D-Typ Flip-Flops und richtig codiert wurde, sollte es sein).

Diese Linien werden auch im aktiven Bereich ausgeführt werden:

if(e === z) 
    ok = 1; 
    else 
ok = 0; 

so z wird noch an diesem Punkt seinen vorherigen Wert haben. Diese Linie

$monitor("%5d: clk=%b,d=%d,z=%d,expect=%d, ok=%d", $time,clk,d,z, e, ok); 

wird im VERSCHOBEN Region ausgeführt werden, so um diese Zeit zwird seinen neuen Wert.

Um dies zu lösen, versuchen Sie #1 vor if(e === z). Dies verzögert den Vergleich bis zum nächsten Zeitschritt, in dem z Zeit zum Ändern hatte.

Dies ist eine häufige Situation mit HDLs. Sie müssen einige kurze, aber echte Zeit warten, bevor Sie Ausgänge vergleichen, damit die tatsächlichen Ausgänge abgerechnet werden können.