0
  1. 这是模块单元...

    module register_unit(data_out,data_in,load,clk,rst);
    parameter word_size=8;
    output [word_size-1:0] data_out;
    input [word_size-1:0] data_in;
    input load,clk,rst;
    reg data_out;
    
    always@(posedge clk or negedge rst)
      if(rst==0)
        data_out <= 0;
      else if(load)
        data_out <= data_in;
    endmodule
    
  2. 这是测试台

    `include "register_unit.v"
    
    module test_bench();
    
    parameter word_size=8;
    
    reg clk,rst,load;
    reg [word_size-1:0] data_in;
    wire [word_size-1:0] data_out;
    
    register_unit m1 (.data_out(data_out),.data_in(data_in),.load(load),.clk(clk),.rst(rst));
    
    initial
    begin
      clk=0;
      forever begin
        #5 clk = ! clk; 
      end
    end
    
    initial
    begin
      rst=0;
      data_out=8'b0;
      load=0;
      #10 rst=1;
      load=1;
      #10 data_out=8'b00000100;
      #10 data_out=8'b00000101;
      #20 load=0;
    end
    
    initial
    begin
      $dumpfile ("register_unit.vcd");
      $dumpvars;
    end
    endmodule
    
  3. 我正在使用 linux 中的 iverilog 命令编译此代码。

  4. iverilog -o register_unit.v register_unit_tb.v

  5. 在编译代码时,它在 data_out 端口上出现错误,它说它是无效的转换。

  6. 错误是 data_out 不是 test_bench 中的有效左值,并且 data_out 在这里被声明为线。

4

1 回答 1

0

wire您不能为initial块中的a 赋值。在initial测试台的块中,更改data_outdata_in

initial
begin
rst=0;
data_in=8'b0;
load=0;
#10 rst=1;
load=1;
#10 data_in=8'b00000100;
#10 data_in=8'b00000101;
#20 load=0;
end

我还在register_unit. 您应该声明reg使用位宽:

reg [word_size-1:0] data_out;
于 2017-03-07T19:27:39.340 回答