位操作- Verilog中python式的位切片



在Python中,我可以像这样选择偶数或奇数位:

>>> bits = ['a','b','c','d'];
>>> bits[0::2]
['a', 'c']
>>> bits[1::2]
['b', 'd']

如果我能在Verilog中做到这一点,那将是非常实用的,这样我就不必展开表达式并手动执行了。展开(即{a[0], a[2]}{a[1], a[3]}),它显然不能与我的其他参数化线集一起工作。

在Verilog或SystemVerilog中没有像您给出的Python示例那样执行位切片的机制。也就是说,您不能指定位与位之间的步长为2。

你可以用for循环来实现,它不需要像你自己的答案那样放在生成块中。

从你的回答修改的例子:

always @(*) begin
   for (int i = 0; i < FLOORS; i++) begin
      RELEVANT[i] <= FLOOR_REQUEST[i*2+FORWARD];
   end
end

只要FLOORS是常数,就可以合成

这可以通过生成块来完成。例子:

wire [FLOORS-1:0] RELEVANT;
genvar i;
generate
    for (i=0; i<FLOORS; i=i+1) begin
        assign RELEVANT[i] = FLOOR_REQUEST[i*2+FORWARD];
    end
endgenerate
  • FLOORS为输出线宽度(输入线宽度的一半)。
  • RELEVANT为结果
  • FORWARD是偶/奇选择器(0或1)。
  • FLOOR_REQUEST为输入。

最新更新