2013-11-28 3 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 encoder] & [vvp encoder vcd] 명령을 사용하면 $ monitor와 몇 $ display 문을 생각할 때마다 아무 것도주지 않는다. . 나는 오류를 찾으려고 노력했지만 나는 이것에 대해 아주 새롭기 때문에 이것을 디버그 할 수 없다. 모든 도움을 주셨습니다. 감사합니다.Verilog 코드가 오류없이 컴파일되지만 출력되지 않습니다.

+0

디스플레이 문이 복잡한 RTL 디버깅에 정말 충분하지 않다. 파형 뷰어 프로그램을 사용해보아야합니다. * 자일링스 ISE webpack *은 유용하고 무료이며, 아마도 iVerilog * – Tim

+0

이 코드는 2 명의 시뮬레이터에서 컴파일 오류를 발생시킨다. 이것이 당신의 정확한 코드라고 확신합니까? – toolic

+0

@Tim - GTKwave를 사용하여 $ dumpfile 및 $ dumpvars 명령을 사용하여 파형을 생성/포함하려했지만 파형을 생성 할 수 없습니다. 감사합니다 – user3043882

답변

0

두 개의 다른 시뮬레이터 (VCS 및 Incisive)에서 코드로 컴파일 오류가 발생합니다. 아마도 시뮬레이터가 코드를 컴파일하지만 잘못된 코딩 때문에 제대로 시뮬레이트하지 못할 수도 있습니다.

encoder_tb 모듈에는 inputoutput 문이 있지만 포트 목록은 없습니다.

encoder_tb 모듈 자체의 재귀 인스턴스가 있습니다.

wire (op)에 대한 절차 지정을 지정합니다. 나는 이러한 변경 작업을 수행 할 때

, 좀 출력을 얻을 :

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

관련 문제