verilog - 在case语句系统verilog中生成块
问题描述
我想在系统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
有没有办法使用生成块做同样的事情?下面的代码将不起作用,因为在不同的块中有多个驱动程序用于输出变量。
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
解决方案
对于您尝试合成的内容,使用生成块是没有用的。当您想要实例化多个模块时,最好使用生成块。
这是一个很好的参考,可以帮助您了解如何将 generate 与 case 语句一起使用,但您也可以使用简单的 for 循环来做到这一点。
https://www.verilogpro.com/verilog-generate-configurable-rtl/
推荐阅读
- arrays - 在powershell中,如何从命令行传递的“剩余”参数构建字符串数组?
- javascript - onClick 事件未在 React Popover 上触发(材料 UI)
- c++ - 为什么在 C++ 中出现重新定义错误?
- html - 文本不响应单独的段落(html、css)
- angular - 使用 Angular 进行 Firebase 身份验证:如何在关闭选项卡时保持用户会话处于活动状态?onIdTokenChanged 与 onAuthStateChanged
- excel - 使用单元格值中的文件名和路径保存 Excel 工作表的宏
- python-3.x - 将 .npz 模型从 ChainerRL 转换为 Keras 模型,或替代方法?
- typescript - Webpack 和 Typescript - 使用 /node_modules/.bin/tsc 而不是全局
- vue.js - vue-table-2 更改搜索过滤器以在按钮单击而不是击键时触发
- r - 有没有办法在 R 中生成一个至少有一些负特征值的矩阵?