Verilog中如何声明并使用参数化位宽的常数?
Verilog参数化位宽常数实现方案
你可以通过Verilog的位拼接运算符实现参数适配的两种常数,写法完全匹配你实例化mux时传入的n+2动态位宽:
- 全1常数:写法为
{(n+2){1'b1}},通过复制运算符生成位宽为n+2的全1向量,参数n调整时位宽会自动适配,不需要手动修改硬编码值。 - 高位全0、仅最低位为1的常数:写法为
{{(n+1){1'b0}}, 1'b1},高位拼接n+1个0、最低位补1,最终总位宽刚好为n+2,完全符合需求。
你可以根据Sel的逻辑选择两个常数的填入位置,假设Sel为1时选全1、为0时选最低位为1的数,修改后完整代码如下:
module mux2to1 #(parameter w = 4) (output [w-1:0] O, input [w-1:0] i0, i1, input Sel); assign O = (Sel)? i1 : i0; endmodule module M1 #(parameter n = 4) (input [n-1:0] A, input F, output [n+1:0] B); mux2to1#(n+2) mux (B, {{(n+1){1'b0}}, 1'b1}, {(n+2){1'b1}}, F); endmodule
补充说明:如果你的设计兼容SystemVerilog语法,还可以使用更简洁的写法:全1写为
'1、仅最低位为1写为'b1,编译器会自动匹配对应变量的位宽,不需要手动计算拼接位数。
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

