可变切片向量 Systemverilog
Variable slicing vector Systemverilog
我正在为错误 "Range must be constant" 而苦苦挣扎,但我认为它是!
我要实现的操作是这样的:
给定一个 8 位 signed/unsigned 向量和变量点,例如:
b7b6b5b4b3b2.b1b0 或 b7b6b5b4b3.b2b1b0
我必须将整数部分与第一个小数位相加,例如:
b7b6b5b4b3b2 + b1 第一个字,
b7b6b5b4b3+b2 为第二种情况。
小数位数由名为 "port_scale" wide C_SHIFT_BITS 的端口给出。
这是我的代码,我想生成所有的组合:
C_SHIFT_BITS = 4;
always_comb begin
for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
dout_temp[k-1][8:0] = din[(k-1)+:8-k] + din[(k-1)+:1]
end
for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
if (port_scale == k) begin
dout = dout_temp[k][8:0];
end
end
end
您是否有其他解决方案或方法对此进行编码以使其通用?我不会编写大量的 case 语句,因为参数 C_SHIFT_BITS 可能是任何数字,小于 din 的宽度。 for 循环应该解决非法 din[port_scale...] 但它没有按预期工作。
谢谢
我认为你只需移动 k
dout_temp[k-1][8:0] = (din >> k-1) + din[k];
你也可以摆脱你的第二个 for 循环并做
dout = dout_temp[port_scale][8:0];
我正在为错误 "Range must be constant" 而苦苦挣扎,但我认为它是!
我要实现的操作是这样的:
给定一个 8 位 signed/unsigned 向量和变量点,例如: b7b6b5b4b3b2.b1b0 或 b7b6b5b4b3.b2b1b0
我必须将整数部分与第一个小数位相加,例如:
b7b6b5b4b3b2 + b1 第一个字, b7b6b5b4b3+b2 为第二种情况。
小数位数由名为 "port_scale" wide C_SHIFT_BITS 的端口给出。
这是我的代码,我想生成所有的组合:
C_SHIFT_BITS = 4;
always_comb begin
for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
dout_temp[k-1][8:0] = din[(k-1)+:8-k] + din[(k-1)+:1]
end
for (int k=1; k<2**(C_SHIFT_BITS-1); k++) begin
if (port_scale == k) begin
dout = dout_temp[k][8:0];
end
end
end
您是否有其他解决方案或方法对此进行编码以使其通用?我不会编写大量的 case 语句,因为参数 C_SHIFT_BITS 可能是任何数字,小于 din 的宽度。 for 循环应该解决非法 din[port_scale...] 但它没有按预期工作。
谢谢
我认为你只需移动 k
dout_temp[k-1][8:0] = (din >> k-1) + din[k];
你也可以摆脱你的第二个 for 循环并做
dout = dout_temp[port_scale][8:0];