我想选择性地在系统Verilog中编译以下代码:
always_comb begin
out = 0;
case(exp)
state_1: out = a*b;
state_2: out = b|c;
state_3: out = c^d;
endcase
end
这是正确的做法吗?是否会在综合过程中删除state_3代码?
parameter PARAM_1 = 1'b1;
parameter PARAM_2 = 1'b1;
parameter PARAM_3 = 1'b0;
always_comb begin
out = 0;
case(exp)
state_1: if (PARAM_1 == 1'b1) out = a*b;
state_2: if (PARAM_2 == 1'b1) out = b|c;
state_3: if (PARAM_3 == 1'b1) out = c^d;
endcase
end
我希望以上代码的输出在合成后如下所示。
always_comb begin
out = 0;
case(exp)
state_1: out = a*b;
state_2: out = b|c;
endcase
end
有没有一种方法可以使用generate block完成?下面的代码不起作用,因为在不同的块中有多个驱动程序可以输出可变性。
parameter PARAM_1 = 1'b1;
parameter PARAM_2 = 1'b1;
parameter PARAM_3 = 1'b0;
generate
if (PARAM_1 ==1'b1) begin
always_comb begin
case(exp)
state_1: out = a*b;
default : out = 0;
endcase
end
endgenerate
generate
if (PARAM_2 ==1'b1) begin
always_comb begin
case(exp)
state_1: out = b|c;
default : out = 0;
endcase
end
endgenerate
generate
if (PARAM_3 ==1'b1) begin
always_comb begin
case(exp)
state_1: out = c^d;
default : out = 0
endcase
end
endgenerate
答案 0 :(得分:0)
对于要合成的内容,不使用generate块。当您要实例化多个模块时,最好使用生成块。
这里是了解如何使用带有case语句的generate的很好参考,但是您也可以使用简单的for循环来做到这一点。
https://www.verilogpro.com/verilog-generate-configurable-rtl/