【问题标题】:The generate if condition must be a constant expression生成 if 条件必须是常量表达式
【发布时间】:2020-08-18 07:29:02
【问题描述】:

我正在尝试为 RISC-V 程序集创建一个即时生成器,但我遇到了 if 语句。 这是我在 Verilog 中的代码:

module signextend(in, out, sel);
    parameter nin = 32;
    parameter nout = 32;
    input [nin-1:nin-25] in;
    input [2:0] sel;
    output [nout-1:0] out;
    
    if (sel == 3'b000)
        begin
            assign out[19:0] = in[31:12];
            assign out[31:20] = {12{in[31]}};
        end
    else if (sel == 3'b001) 
        begin
            assign out[11:0] = in[31:20];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b010)
        begin
            assign out[4:0] = in[24:20];
            assign out[31:5] = 0;
        end
    else if (sel == 3'b011)
        begin
            assign out[3:0] = in[11:8];
            assign out[4:9] = in[30:25];
            assign out[10] = in[7];
            assign out[11] = in[31];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b100)
        begin
            assign out[4:0] = in[11:7];
            assign out[11:5] = in[31:25];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b101)
        begin
            assign out[9:0] = in[21:30];
            assign out[10] = in[20];
            assign out[18:11] = in[19:12];
            assign out[19] = in[31];
            assign out[31:20] = {12{in[31]}};
        end 
    else 
        assign out = 32'hxxxx;  
endmodule

每个if语句都存在问题:生成if条件必须是常量表达式。

【问题讨论】:

    标签: if-statement verilog modelsim riscv sign-extension


    【解决方案1】:

    您需要将所有代码放入 always 块中并删除 assigns:

    always @(*) begin
      if (sel == 3'b000)
          begin
              out[19:0] = in[31:12];
              out[31:20] = {12{in[31]}};
          end
      else if (sel == 3'b001) 
        // etc
    

    always 块包含 一点点软件(您的 if 语句),模拟 一点点硬件(产生的组合逻辑)。

    always(或initial)块之外有一个if 语句是合法的,但它意味着不同的东西。那么它意味着有条件的包含硬件,即如果某些条件为真,则包含这个硬件。这样的条件必须是静态的,即在编译时固定。它不能是输入,例如您的 sel。如果您考虑一下,这完全有道理:您如何创建一些硬件,这些硬件会根据某些输入的值神奇地出现和消失?你不能。这就是你得到错误的原因。

    您需要删除assigns,因为虽然assignalways 块内是合法的,但这意味着一些奇怪的东西。永远不要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多