【问题标题】:Verilog null/invalid slice ranges in unreachable evaluationsVerilog 无法访问的评估中的空/无效切片范围
【发布时间】:2017-10-03 17:00:17
【问题描述】:

有时在参数化代码中会出现一种情况,我想检查一个数组切片,如果该切片的宽度不为零。我可能会这样写:

parameter SLICE_WIDTH;
parameter SLICE_BASE;
logic [my_array_size : 0] my_array;
//...
always_ff @ (posedge clk) begin
   if (SLICE_WIDTH==0 || my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin
   //alternately "if (SLICE_WIDTH==0 || my_array[SLICE_WIDTH+SLICE_BASE-1:SLICE_BASE]==0) begin"
      //do something
   end
   else begin
      //do something else
   end
end

这就是我在编写 VHDL 时处理这些情况的方式;依靠不断评估中的短路来防止评估无效的数组范围。在编写的系统verilog中,这会在QuestaSim中引发“零件选择范围被反转”错误和“范围宽度不能为零”错误。

有没有办法干净地处理大多数工具接受的空范围,而无需将//do something 的内容复制到几个 if-generate 构造中?

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    你可以做的是创建一个掩码参数

    parameter SLICE_WIDTH;
    parameter SLICE_BASE;
    localparam logic [my_array_size : 0] MASK) = 2**SLICE_WIDTH - 1 << SLICE_BASE;
    logic [my_array_size : 0] my_array;
    //...
    always_ff @ (posedge clk)
       if (my_array&MASK) begin
          //do something
       end
       else begin
          //do something else
       end
    

    当 MASK 为 0 时,综合工具将优化逻辑。

    没有对此进行测试,因此您可能不得不使用我的方程式。

    【讨论】:

    • 我可以在这个例子中使用掩蔽的变体,虽然很遗憾没有更简洁的通用情况。我想我可以使用 generate 将条件组合压缩成一个中间网络,而无需克隆许多顺序逻辑。
    【解决方案2】:

    在 verilog 中处理它的常用方法是“生成”块。

    parameter SLICE_WIDTH;
    parameter SLICE_BASE;
    
    logic [my_array_size : 0] my_array;
    //...
    
    // generate
    if (SLICE_WIDTH==0) begin
        // do something here
    end
    else begin
       always_ff @ (posedge clk) begin
          if ( my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin
             //do something
          end
          else begin
             //do something else
          end
       end
    end // endgenerate
    

    使用 SV,您不需要使用 generate/endgenerate 关键字。

    【讨论】:

    • OP 特别要求提供不涉及复制 do something 代码块的解决方案。
    • 此解决方案是在 verilog 中解决此类问题的唯一干净且经过验证的方法。其余的只是可能在某些特定情况下起作用的技巧和窍门。
    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 2020-10-05
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多