在 SystemVerilog 中的一个数组中串联具有特定范围的两个数组

Concatenation of two arrays with specific range in one array in SystemVerilog

我试图将一个数组的两个特定跨度存储在另一个数组中,但出现错误。

我想做的事情:

我有 [8-1:0]A 作为模块输入,我想存储 :

逻辑[8-1:0]temp = {A[4:7],A[0:3]};

但是,当我在测试台上模拟我的模块时,我在 modelSim 中遇到错误:

error: Range of part-select into 'A' is reversed.

我尝试过的方法:

将逻辑转换为线路, 使用赋值

我觉得思路有问题

示例:

A = 8'b11000101 -> 我希望 temp 成为 -> temp=8'b00111010

->解释:

A[0]=1,A[1]=0,A[2]=1,A[3]=0,A[4]=0,A[5]=0,A[6]=1,A[7]=1.
A[4..7]=4'b0011,A[0..3]=4'b1010

`timescale 1ns/1ns 
module examp(input [7:0]A,output [7:0]O);
    logic [7:0]temp = {A[4:7],A[0:3]};
//  I wanna temp be  8'b00111010.
    assign O = temp;
endmodule

`timescale 1ns/1ns 
module examp_tb();
    logic [7:0]aa=8'b11000101;
    wire [7:0]ww;

    examp MUX_TB(.A(aa),.O(ww));

    initial begin

    #200 aa=8'b01100111;
    
    #200 $stop;
    end
endmodule

注意:在上面的例子中,我有编译错误,但在主要问题中,我有模拟错误。

在半字节内交换位的一种方法是使用 function:

module examp (input [7:0] A, output [7:0] O);
    assign O = {swap_nib(A[7:4]),  swap_nib(A[3:0])};

    function logic [3:0] swap_nib (logic [3:0] in);
        swap_nib[3] = in[0];
        swap_nib[2] = in[1];
        swap_nib[1] = in[2];
        swap_nib[0] = in[3];
    endfunction
endmodule

流运算符可用于反转一组位。所以你可以这样做:

logic [8-1:0]temp = { {<<{A[7:4]}} , {<<{A[3:0]}} };

流运算符还采用切片参数,用于在执行位反转之前保留一组位。你想要的问题是你试图反转切片中的位。您可以通过嵌套流操作符来完成此操作。这种方法在处理较大的向量时更有用

logic [7:0] temp1 = {<<{A}}; // A[0:7]
logic [7:0] temp2 = {<<4{temp1}}; // A[4:7],A[03];

或单行

logic [7:0] temp = {<<4{ {<<{A}} }};