如何解决SystemVerilog中一个数组中具有特定范围的两个数组的串联
我试图将一个数组的两个特定跨度存储在另一个数组中,但出现错误。
我想做什么:
我有 [8-1:0]A
作为模块输入,我想存储:
逻辑[8-1:0]temp = {A[4:7],A[0:3]};
但是,当我在测试台上模拟我的模块时,在 modelSim 中出现错误:
错误:部分选择到“A”的范围被颠倒了。
我尝试过的方法:
将逻辑转换为连线, 使用赋值
我认为这个想法有问题。
示例:
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}} }};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。