在案例陈述系统verilog中生成块

时间:2019-11-19 07:24:10

标签: verilog system-verilog synthesis

我想选择性地在系统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

1 个答案:

答案 0 :(得分:0)

对于要合成的内容,不使用generate块。当您要实例化多个模块时,最好使用生成块。

这里是了解如何使用带有case语句的generate的很好参考,但是您也可以使用简单的for循环来做到这一点。

https://www.verilogpro.com/verilog-generate-configurable-rtl/