可变切片向量Systemverilog

时间:2019-01-31 16:56:52

标签: verilog system-verilog hdl

我认为错误是“范围必须恒定”的错误!

我要执行的操作是这样:

给出一个8位有符号/无符号向量和VARIABLE点,如: b7b6b5b4b3b2.b1b0或b7b6b5b4b3.b2b1b0

我必须在整数部分加上第一个小数位,例如:

b7b6b5b4b3b2 + b1表示第一个单词, b7b6b5b4b3 + b2。

小数位数由一个名为“ port_scale”宽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 ...],但无法正常工作。

谢谢

1 个答案:

答案 0 :(得分:0)

我认为您只需要移动k

 dout_temp[k-1][8:0] = (din >> k-1) + din[k];

您还可以摆脱第二个for循环并执行

  dout = dout_temp[port_scale][8:0];