2016-03-27 22 views
1

以下のソースコードの問題を修正しています。 私は期待値と実際に値を比較するoracleを作成しています。 私が計算しようとする期待値は変数 'e'です。 実際の値は変数 'z'です。Verilog Oracle、期待値が正しく動作しない

変数 'ok'は 'e === z'のとき '1'にする必要があります。しかし、それは 'ok'を '1'に設定していません。

ここはソースコードです。

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 

そして、ここではサンプル出力

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 

ご覧のとおり、それはそれらのいくつかは、同じ「Z」を持っていると値を「期待する」ことを示しています。しかし 'ok'は常に '0'に設定されています。私が同じであっても1を設定するようにそれをコーディングしました。

これはわかりません。助けてください、ありがとう。

答えて

2

registerのコードを入力することができないため、確認が難しいです。しかし、スケジューリングに問題があると思われます。 Verilogのは4つのスケジューリング領域があります

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

この行は、アクティブ領域で実行されます。

e=d; 

zはおそらくは(私は確認することはできませんNBA領域でに更新されていますコードなしで、しかしregisterがいくつかのD型フリップフロップであり、適切にコーディングされていれば、そうでなければなりません)。

これらの線は、活性領域で実行されます

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

のでzがまだその時点で、その前の値を有することになります。この時点でzその新しい価値を持つことになりますので、このライン

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

は、延期地域で実行されます。

これを解決するには、をif(e === z)の前に入力してください。これにより、次の時間ステップまでの比較が遅れます。その時間はzに変更する時間があります。

これは一般的なHDLの状況です。出力を比較する前に、実際にの出力を確定させるために、短いものの実際の時間を待つ必要があります。