2013-11-28 302 views
0
module encoder (op, in, clock, reset); 

    //$display("We are in initial procedural block"); 

    input [15:0] in; 
    input clock, reset; 
    output [3:0] op; 

    wire [15:0] in; 
    wire clock, reset; 

    reg [3:0] op; 

    always @ (posedge clock) 
    begin 
      $display("We are in initial procedural block"); 

      if (reset) 
      begin 
       $display("we are in the reset condition"); 
       op = 0; 
      end 
      else 
      begin 
       case(in) 
        16'h0002: #1 op = 4'b0001; 
        16'h0004: #1 op = 4'b0010; 
        16'h0008: #1 op = 4'b0011; 
        16'h0010: #1 op = 4'b0100; 
        16'h0012: #1 op = 4'b0101; 
        16'h0014: #1 op = 4'b0110; 
        16'h0018: #1 op = 4'b0111; 
        16'h0020: #1 op = 4'b1000; 
        16'h0022: #1 op = 4'b1001; 
        16'h0024: #1 op = 4'b1010; 
        16'h0028: #1 op = 4'b1011; 
        16'h0030: #1 op = 4'b1100; 
        16'h0032: #1 op = 4'b1101; 
        16'h0034: #1 op = 4'b1110; 
        16'h0038: #1 op = 4'b1111; 
        16'h0040: #1 op = 4'b0000; 
        default : $display("DEFAULT!!!"); 
       endcase 
      end 
    end 
endmodule 

module encoder_tb; 

    input in, reset, clock; 
    output op; 

    reg [15:0] in = 16'h0000; 
    reg reset, clock; 
    wire [3:0] op; 

    //internal variable 
    reg [15:0] incremental_value = 16'h0002; 

    initial 
    begin 
      $monitor("time = %g,\tclock = %d,\tin = %h,\top = %b", 
          $time,  reset,  in,  op); 

      $display("We are in initial procedural block"); 

      in = 0; 
      reset = 0; 
      clock = 0; 
      op = 0; 
     #1 clock = !clock; 
     #10 reset = !reset; 
     #5 in = in + incremental_value; 
      #100 $finish; 
    end 

    always 
    begin 
    #1 clock = !clock; 
    #10 reset = !reset; 
    #5 in = in + incremental_value; 
    end 

    encoder_tb test_bench (.op(op), .in(in), .clock(clock), .reset(reset)); 

    // Waveform Generation 
    initial 
    begin 
      $dumpfile("encoder.vcd"); 
      $dumpvars(0,op,in,clock,reset); 
    end 

endmodule 

上面我試圖創建一個16位輸入到4位輸出編碼器。我能夠編譯我的代碼沒有任何錯誤,但在[iverilog encoder_tb.v -o編碼器] & [vvp編碼器vcd]命令後,它不給我任何提示,即使我給了$ monitor和幾個$ display語句,我可以想到任何地方。我試圖找到錯誤,但由於我對此很新,所以我無法調試。任何和所有幫助表示讚賞。 謝謝。Verilog代碼編譯沒有錯誤,但沒有輸出

+0

顯示陳述並非對調試任何複雜的RTL真的足夠了。你應該看看使用波形觀察程序。 * Xilinx ISE webpack *是一個非常有用的免費軟件,可能會引起您的注意,或者可能* iVerilog * – Tim

+0

該代碼給我帶來了2個模擬器的編譯錯誤。你確定這是你的確切代碼嗎? – toolic

+0

@Tim - 我已經包含/嘗試使用命令$ dumpfile和$ dumpvars使用GTKwave生成波形,但我無法生成任何波形。謝謝 – user3043882

回答

0

我在2個不同的模擬器(VCS和Incisive)上用你的代碼得到編譯錯誤。也許你的模擬器編譯代碼,但是由於編碼不好而無法正確模擬。

encoder_tb模塊有inputoutput語句但沒有端口列表。

encoder_tb模塊有自己的遞歸實例。

您將程序分配給wireop)。

當我做這些改變,我得到一些輸出:

module encoder (op, in, clock, reset); 

    //$display("We are in initial procedural block"); 

    input [15:0] in; 
    input clock, reset; 
    output [3:0] op; 

    wire [15:0] in; 
    wire clock, reset; 

    reg [3:0] op; 

    always @ (posedge clock) 
    begin 
      $display("We are in initial procedural block"); 

      if (reset) 
      begin 
       $display("we are in the reset condition"); 
       op = 0; 
      end 
      else 
      begin 
       case(in) 
        16'h0002: #1 op = 4'b0001; 
        16'h0004: #1 op = 4'b0010; 
        16'h0008: #1 op = 4'b0011; 
        16'h0010: #1 op = 4'b0100; 
        16'h0012: #1 op = 4'b0101; 
        16'h0014: #1 op = 4'b0110; 
        16'h0018: #1 op = 4'b0111; 
        16'h0020: #1 op = 4'b1000; 
        16'h0022: #1 op = 4'b1001; 
        16'h0024: #1 op = 4'b1010; 
        16'h0028: #1 op = 4'b1011; 
        16'h0030: #1 op = 4'b1100; 
        16'h0032: #1 op = 4'b1101; 
        16'h0034: #1 op = 4'b1110; 
        16'h0038: #1 op = 4'b1111; 
        16'h0040: #1 op = 4'b0000; 
        default : $display("DEFAULT!!!"); 
       endcase 
      end 
    end 
endmodule 

module encoder_tb; 

//  input in, reset, clock; 
//  output op; 

    reg [15:0] in = 16'h0000; 
    reg reset, clock; 
    wire [3:0] op; 

    //internal variable 
    reg [15:0] incremental_value = 16'h0002; 

    initial 
    begin 
      $monitor("time = %g,\tclock = %d,\tin = %h,\top = %b", 
          $time,  reset,  in,  op); 

      $display("We are in initial procedural block"); 

      in = 0; 
      reset = 0; 
      clock = 0; 
//   op = 0; 
     #1 clock = !clock; 
     #10 reset = !reset; 
     #5 in = in + incremental_value; 
      #100 $finish; 
    end 

    always 
    begin 
    #1 clock = !clock; 
    #10 reset = !reset; 
    #5 in = in + incremental_value; 
    end 

//  encoder_tb test_bench (.op(op), .in(in), .clock(clock), .reset(reset)); 
    encoder test_bench (.op(op), .in(in), .clock(clock), .reset(reset)); 

    // Waveform Generation 
    initial 
    begin 
      $dumpfile("encoder.vcd"); 
      $dumpvars(0,op,in,clock,reset); 
    end 

endmodule 


/* 

We are in initial procedural block 
time = 0,  clock = 0,  in = 0000,  op = xxxx 
We are in initial procedural block 
DEFAULT!!! 
time = 16,  clock = 0,  in = 0004,  op = xxxx 
We are in initial procedural block 
time = 18,  clock = 0,  in = 0004,  op = 0010 
time = 27,  clock = 1,  in = 0004,  op = 0010 
time = 32,  clock = 1,  in = 0006,  op = 0010 
time = 43,  clock = 0,  in = 0006,  op = 0010 
time = 48,  clock = 0,  in = 0008,  op = 0010 
We are in initial procedural block 
time = 50,  clock = 0,  in = 0008,  op = 0011 
time = 59,  clock = 1,  in = 0008,  op = 0011 
time = 64,  clock = 1,  in = 000a,  op = 0011 
time = 75,  clock = 0,  in = 000a,  op = 0011 
time = 80,  clock = 0,  in = 000c,  op = 0011 
We are in initial procedural block 
DEFAULT!!! 
time = 91,  clock = 1,  in = 000c,  op = 0011 
time = 96,  clock = 1,  in = 000e,  op = 0011 
time = 107,  clock = 0,  in = 000e,  op = 0011 
time = 112,  clock = 0,  in = 0010,  op = 0011 
We are in initial procedural block 
time = 114,  clock = 0,  in = 0010,  op = 0100 

*/ 
+1

這也適用於我的模擬器。謝謝你的幫助。最後,你的模擬器VCS和Incisive免費版本模擬器,因爲你可能是正確的,因爲我的伊卡洛斯是一個免費的,它可能有一些錯誤。謝謝你的幫助。 – user3043882

+0

有什麼錯誤? – user3043882

+0

很高興幫助。我使用的版本不是免費的。我想你會得到你付出的東西:) – toolic