假设我有一个多维数组:
logic [7:0] mda [7:0];
我现在要做的是将mda[7:4]
分配给输出端口,即定义如下:
output [31:0] odata;
当然,我可以通过使用连接来实现:
assign odata = {mda[7], mda[6], mda[5], mda[4]};
但是应该(并且可能是)更简单的方法来做到这一点。第一次尝试将是:
assign odata = mda[7:4];
这是错误的,因为类型(解压缩< - >压缩数组)不匹配。我所有的投射尝试(例如32'(mda[7:4])
)都失败了。问题是:将该切片分配给输出端口的最佳方法是什么?
答案 0 :(得分:4)
你可以使用for循环...大多数综合工具在常数范围内的for循环都没有问题:
module dut(output [31:0] odata);
logic [7:0] mda [7:0];
reg[31:0] data;
always @* begin
data = 0;
for(int i=7; i >=4; i--) begin
data <<= 8;
data |= mda[i];
end
end
assign odata = data;
endmodule
这是一个快速测试:http://www.edaplayground.com/x/GfM
答案 1 :(得分:3)
您可以使用流媒体运营商:
initial begin
logic[31:0] data;
mda[7] = 'hde;
mda[6] = 'had;
mda[5] = 'hbe;
mda[4] = 'hef;
data = { >> { mda[7:4] }};
$display("data = ", data);
end
这在程序上下文中完美地起作用,但在连续的赋值上下文中(由于某种原因)不起作用。这意味着这不起作用:
assign odata = { >> { mda[7:4] }};
你必须找到一个解决方法,在这里你可以在程序上下文中进行流式处理(可能是一些always
块),然后将结果分配给你的线。