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