【问题标题】:What is `+:` and `-:`?什么是`+:`和`-:`?
【发布时间】:2022-01-21 12:23:57
【问题描述】:

+:-: Verilog/SystemVerilog 运算符是什么?您何时以及如何使用它们?例如:

logic [15:0] down_vect;
logic [0:15] up_vect;

down_vect[lsb_base_expr +: width_expr]
up_vect  [msb_base_expr +: width_expr]
down_vect[msb_base_expr -: width_expr]
up_vect  [lsb_base_expr -: width_expr]

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    该特定语法称为索引部分选择。当您需要从多位寄存器中的可变偏移量中选择固定位数时,它非常有用。

    这是一个语法示例:

    reg [31:0] dword;
    reg [7:0] byte0;
    reg [7:0] byte1;
    reg [7:0] byte2;
    reg [7:0] byte3;
    
    assign byte0 = dword[0 +: 8];    // Same as dword[7:0]
    assign byte1 = dword[8 +: 8];    // Same as dword[15:8]
    assign byte2 = dword[16 +: 8];   // Same as dword[23:16]
    assign byte3 = dword[24 +: 8];   // Same as dword[31:24]
    

    这种语法的最大优点是您可以使用变量作为索引。 Verilog 中的正常部分选择需要常量。因此,不允许使用 dword[i+7:i] 之类的方式尝试上述操作。

    所以如果你想使用变量选择来选择一个特定的字节,你可以使用索引部分选择。

    使用变量的示例:

    reg [31:0] dword;
    reg [7:0] byte; 
    reg [1:0] i;
    
    // This is illegal due to the variable i, even though the width is always 8 bits
    assign byte = dword[(i*8)+7 : i*8];  // ** Not allowed!
    
    // Use the indexed part select 
    assign byte = dword[i*8 +: 8];
    

    【讨论】:

      【解决方案2】:

      这个操作符的作用是当你需要访问总线的一个切片时,MSB位置和LSB位置都是变量,但是切片的宽度是一个常数值,如下例:

      bit[7:0] bus_in = 8'hAA;
      int lsb = 3;
      int msb = lsb+3;  // Setting msb=6, for out bus of 4 bits
      
      bit[3:0] bus_out_bad = bus_in[msb:lsb]; // ILLEGAL - both boundaries are variables
      bit[3:0] bus_out_ok  = bus_in[lsb+:3]; // Good - only one variable
      

      【讨论】:

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