【问题标题】:Trouble using 'generate' in verilog always block在verilog中使用“生成”时出现问题总是阻塞
【发布时间】:2012-04-20 18:48:26
【问题描述】:

我尝试在 Verilog 的 case 语句中生成一些条件。

我有一个称为 MANT_WIDTH 的参数,case 语句中的条件数取决于 MANT_WIDTH 的值

例如我有

always @(*) begin
  case (myvariable)
   {MANT_WIDTH{1'b1}}:
   begin  new_variable = {1'b0, {MANT_WIDTH{1'b1}}};       end

   genvar n;
   generate
     for (n = 2; n <= MANT_WIDTH-1; n = n+1) begin: NORMALIZE
       {(MANT_WIDTH-n){1'b0}},{n{1'b1}}}:
       begin new_variable = {{n{1'b1}},1'b0;
     end


   endgenerate


   default:
   begin  new_variable = {(MANT_WIDTH+1){1'b0}};           end
 endmodule
end

这段代码中可能有一些没有意义的条件(不正确的位宽等),但我想要做的事情的要点就在这里。

我遇到的问题是,当我尝试使用 ncverilog 模拟此代码时出现以下错误:

     for (n = 2; n <= MANT_WIDTH-1; n = n+1) begin: NORMALIZE
          |

ncvlog: *E, ILLPRI (fpmodule.v,278|6): 非法表达式primary [4.2(IEEE)]

我也得到非法的左值语法 [9.2[IEEE)]

我需要计算前导零。我实际上并没有粘贴我的真实代码,我只需要一些方法来计算前导零,但我有一些特殊情况必须放在 for 循环之外。

非常感谢!

【问题讨论】:

    标签: verilog hdl synthesize


    【解决方案1】:

    在 always 块中使用 generate 是不合法的。它们只在模块声明范围内有效。

    module;
    //Valid here
    endmodule
    

    我有一个称为 MANT_WIDTH 的参数和条件数 case 语句取决于 MANT_WIDTH 的值

    无法使用参数直接控制case语句的数量。

    我不知道您要计算什么(new_variable = {myvariable,1'b0}?),但您很少需要生成循环来实现某种转变,而且看起来您在这里也不需要前导零。

    【讨论】:

    • 我需要计算前导零。我实际上并没有粘贴我的真实代码,我只需要一些方法来计算前导零,但我有一些特殊情况必须放在 for 循环之外。
    【解决方案2】:

    我使用了以下编译器指令:

    `ifdef
    `else
    `endif
    

    因此我可以这样定义一个代码块:

    `define MYMACRO 1;
    
    `ifdef MYMACRO
    
    // some code
    
    `else
     `ifdef ANOTHERMACRO
    // different code
    `endif
    `endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多