【问题标题】:Pythonesque bit-slicing in Verilog?Verilog中的Pythonesque位切片?
【发布时间】:2012-12-22 00:40:38
【问题描述】:

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

【问题讨论】:

    标签: bit-manipulation verilog system-verilog


    【解决方案1】:

    在 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 是常数,这应该可以合成。

    【讨论】:

    • 这个解决方案不要求 RELEVANT 是一个 reg 吗?在这种情况下它会合成触发器吗?
    • 它需要声明为 reg 类型,但这并不意味着它会自动合成到 flop。在这种情况下不会。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多