在verilog中使用'generate'的麻烦总是阻塞

时间:2012-04-20 18:48:26

标签: verilog hdl synthesize

我尝试在Verilog的案例陈述中生成一些条件。

我有一个名为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):非法表达主要[4.2(IEEE)]

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

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

非常感谢你!

2 个答案:

答案 0 :(得分:2)

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

module;
//Valid here
endmodule
  

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

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

我不知道你想要计算什么(new_variable = {myvariable,1'b0}?),但你很少需要生成循环来实现某种类型的转换,也不需要在这里看到你需要前导零。

答案 1 :(得分:0)

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

`ifdef
`else
`endif

因此,我可以将代码块定义为:

`define MYMACRO 1;

`ifdef MYMACRO

// some code

`else
 `ifdef ANOTHERMACRO
// different code
`endif
`endif