2012-04-20 122 views
1

我尝试在Verilog的case语句中生成一些条件。在verilog中使用'generate'时出现问题总是阻止

我有一个称为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循环之外。

非常感谢!

回答

0

我使出使用下面的编译器指令:

`ifdef 
`else 
`endif 

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

`define MYMACRO 1; 

`ifdef MYMACRO 

// some code 

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

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

module; 
//Valid here 
endmodule 

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

价值的 条件的数目是没有办法直接控制case语句的数量使用参数。

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

+0

我需要前导零计数。我没有真正粘贴我的真实代码,我只需要一些方法来计算前导零,但我有一些特殊情况需要放在for循环之外。 – Veridian 2012-04-21 00:47:26

相关问题