代码之家  ›  专栏  ›  技术社区  ›  QuantumRipple

无法访问评估中的Verilog空/无效切片范围

  •  0
  • QuantumRipple  · 技术社区  · 7 年前

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

    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构造?

    2 回复  |  直到 7 年前
        1
  •  0
  •   dave_59    7 年前

    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
    

    当掩码为0时,合成工具将优化逻辑。

    我没有测试这个,所以你可能不得不玩我的等式。

        2
  •  0
  •   Serge    7 年前

    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关键字。