Verilog中的Pythonesque位切片?

时间:2012-12-22 00:40:38

标签: bit-manipulation verilog system-verilog

在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]}),显然不适用于我的其他参数化线组。

2 个答案:

答案 0 :(得分:2)

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是常量,这应该合成。

答案 1 :(得分:1)

可以使用生成块完成。例如:

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是输入。