如何根据verilog中的参数将一位扩展为多位?

Pat*_*ick 3 verilog

例如,我有一个输入wire fx, 和parameter DATAWIDTH

我可以写吗

wire [DATAWIDTH - 1 : 0] exfx;
assign exfx = {(DATAWIDTH - 1){1'b0}, fx};
Run Code Online (Sandbox Code Playgroud)

将信号 fx 为零扩展至 DATAWIDTH?

如果我想要 (DATAWIDTH - 1) 位 1 怎么办?或者更复杂的组合?

Old*_*art 8

你快到了。

assign exfx = {{(DATAWIDTH-1){1'b0}}, fx};

这部分:{(DATAWIDTH-1){1'b0}}是你的额外零。然后使用 { ... } 运算符将它们添加到 fx 中。

这是 8 个零位:{8{1'b0}}
这也是 8 位,但模式为 01010101 :{4{2'b01}}

计数可以是一个表达式:{2*DATAWIDTH-1{1'b0}}

您还可以通过重复 MS 位来使用它来对数字进行符号扩展:

localparam WIDTH = 16;
wire       [7:0] A;
wire [WIDTH-1:0] B; 

// Works only for WIDTH > 8 !!
assign B = { {WIDTH-8{A[7]}} , A };
Run Code Online (Sandbox Code Playgroud)