2017-08-30 6 views
2

私は、残りのコードとは別に、8ビットレジスタのモジュールをテストしています。私は値を設定するためにModelSimを使用しているし、結果を見るために実行しています。 このモジュールには、2進数の入力、クリアビット、イネーブルビット、および出力があります。ここVerilog登録コードバグ条件チェック

module Register8bit(D, Clk, Clear, Enable, OutNum); 
    input [7:0] D; //8 bit binary data 
    input Clk;  //Clock 
    input Clear;  //Clear bit 
    input Enable; //Enable bit 
    output reg [7:0] OutNum; 

always @(posedge Clk) 
begin 
    if (Enable) 
     begin 
      if (Clear) 
       OutNum <= 8'b00000000; 
      else 
       OutNum <= D; 
     end 
end 
endmodule 

ので(私はD = 10001111とCLK = 1

Steps CLR Enable OutNum 
1  0  0   xxxxxxxx (initially undefined) 
2  0  1   10001111 (input data is used) 
3  1  0   10001111 (because write-protection) 
4  1  1   00000000 (Clear and Enable are true, so set to 0) 
5  0  1   10001111 (Clear is false and Enable is true, so use input data) 

最初のステップの動作と、(この順番で)期待していたが、第二の一方はない出力されます休むこともできません)。具体的には、OutNumは2番目のステップで未定義のままです。 EnableデータがTrueの場合、入力データでOutNumを更新することは最初のステップで機能します。

このモジュールはどのように修正する必要がありますか?

テストベンチコード:あなたのClk信号を何度も切り替える必要がある

`timescale 1ns/1ps 

module test_register; 

//inputs 
reg [7:0] D; 
reg Clk; 
reg Clear; 
reg Enable; 

//outputs 
reg [7:0] OutNum; 

//instantiate 
Register8bit uut(
    .D(D), 
    .Clk(Clk), 
    .Clear(Clear), 
    .Enable(Enable) 
); 

initial begin 
    D = 10001111; 
    Clk = 1; 

    //step 1 
    #100; 
    Clear = 0; 
    Enable = 0; 
    #100; 

    //step 2 
    Clear = 0; 
    Enable = 1; 
    #100; 

    //step 3 
    Clear = 1; 
    Enable = 0; 
    #100; 

    //step 4 
    Clear = 1; 
    Enable = 1; 
    #100; 

    //step 5 
    Clear = 0; 
    Enable = 1; 
    #100; 
end 
endmodule 
+0

テストベンチコードがアップしています。 – Rez

答えて

1

。あなたのコードはそれを1に設定し、シム全体に対して1にします。

module test_register; 

//inputs 
reg [7:0] D; 
reg Clk; 
reg Clear; 
reg Enable; 

//outputs 
reg [7:0] OutNum; 

//instantiate 
Register8bit uut(
    .OutNum (OutNum), // <---- added missing output 
    .D(D), 
    .Clk(Clk), 
    .Clear(Clear), 
    .Enable(Enable) 
); 

always #50 Clk = ~Clk; 

always @(negedge Clk) begin 
    $display($time, " clr=%b en=%b D=%b OutNum=%b", Clear, Enable, D, OutNum); 
end 

initial begin 
    D = 'b10001111; // <---- use 'b 
    Clk = 1; 

    #50; 

    //step 1 
    #100; 
    Clear = 0; 
    Enable = 0; 
    #100; 

    //step 2 
    Clear = 0; 
    Enable = 1; 
    #100; 

    //step 3 
    Clear = 1; 
    Enable = 0; 
    #100; 

    //step 4 
    Clear = 1; 
    Enable = 1; 
    #100; 

    //step 5 
    Clear = 0; 
    Enable = 1; 
    #100; 
    #500 $finish; 
end 
endmodule 

/* 

Prints out: 

        50 clr=x en=x D=10001111 OutNum=xxxxxxxx 
       150 clr=0 en=0 D=10001111 OutNum=xxxxxxxx 
       250 clr=0 en=1 D=10001111 OutNum=xxxxxxxx 
       350 clr=1 en=0 D=10001111 OutNum=10001111 
       450 clr=1 en=1 D=10001111 OutNum=10001111 
       550 clr=0 en=1 D=10001111 OutNum=00000000 
       650 clr=0 en=1 D=10001111 OutNum=10001111 
       750 clr=0 en=1 D=10001111 OutNum=10001111 
       850 clr=0 en=1 D=10001111 OutNum=10001111 
       950 clr=0 en=1 D=10001111 OutNum=10001111 
       1050 clr=0 en=1 D=10001111 OutNum=10001111 

*/ 
関連する問題