我尝试在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循环之外。
非常感谢你!
答案 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