在verilog中实现4x1多路复用器的问题

时间:2018-01-09 03:49:41

标签: system-verilog icarus

我遇到了4x1多路复用器的问题。代码如下:

module mux4x1( select, d0, d1, d2, d3, q );

    input[1:0] select; //CWP 0, CWP 1

    input[31:0] d0, d1, d2, d3;

    output[31:0] q;
    wire[31:0] q;
    wire[1:0] select;
    wire[3:0] d;

    case (select)
      2'b00 : assign q = d0;
      2'b01 : assign q = d1;
      2'b10 : assign q = d2;
      2'b11 : assign q = d3;
    endcase 

endmodule

不幸的是,当我尝试在其他地方使用它时,它会给我以下错误:

  

testbench.sv:613:错误:无法在`testModule.RWTest.mux1'中绑定参数select   testbench.sv:613:错误:无法评估genvar案例表达式:选择

第613行是case (select) line。我已经对此进行了相当多的调查,并且在其他情况下我看到了非常相似的代码,因此我不确定问题究竟是什么。

1 个答案:

答案 0 :(得分:1)

您需要将case语句放在程序块中,如下所示:

always @(*) begin
  case (select)
    2'b00: q = d0;
    2'b01: q = d1;
    2'b10: q = d2;
    2'b11: q = d3;
  endcase
end

请记住,所有逻辑都需要使用always @(*)(如上面的代码)或单独的assign语句中的组合块内。请注意,这些应该是"顶级"在模块中,即没有像你试图在代码中那样围绕assign的逻辑。

请注意,作为此更改的结果,您需要将q的类型修改为reg而不是wire(还要记住reg类型不是文字硬件寄存器,不幸的是它是学习Verilog的更令人困惑的事情之一)