在 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}} }};
我试图将一个数组的两个特定跨度存储在另一个数组中,但出现错误。
我想做的事情:
我有 [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}} }};