1

我试图在 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 循环之外。

太感谢了!

4

2 回答 2

2

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

module;
//Valid here
endmodule

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

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

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

于 2012-04-20T23:22:13.387 回答
0

我求助于使用以下编译器指令:

`ifdef
`else
`endif

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

`define MYMACRO 1;

`ifdef MYMACRO

// some code

`else
 `ifdef ANOTHERMACRO
// different code
`endif
`endif
于 2012-04-23T15:34:22.130 回答