我有这样的矢量
wire [N:0] Vector[M:0];
我希望将其转换为大小为M * N的数组。伪代码可以是:
Array={Vector[M],Vector[M-1],Vector[M-2],...,Vector[0]}
所以我想在数组中连接向量的元素。 我尝试使用循环来做它,但是当我尝试模拟它时会给出一个没有描述的致命错误。有没有更简单的方法呢?感谢!!!
答案 0 :(得分:3)
我猜你尝试过这样的事情:Array[N*(index+1) : N*index ] = Vector[index];
在一个总是阻止。这不起作用,因为Verilog要求范围的两边都是常数(在模拟期间)。
有三种Verilog方法可以获得所需的任务:
位分配
在Verilog-95(IEEE1364-1995)中,实现这一目标的唯一方法是使用双循环进行位分配:
Array[N*index_m+index_n] = Vector[index_m][index_n];
reg [M*N:0] Array;
integer index_m, index_n;
always @(Vector) begin // Verilog-95 style sensitivity list
for(index_m=0; index_m <= M; index_m = index_m + 1) begin
for(index_n=0; index_n <= N; index_n = index_n + 1) begin
Array[N*index_m+index_n] = Vector[index_m][index_n];
end
endgenerate
数组切片分配
另一种方法是使用+:
进行矢量切片(IEEE1364-2001中添加了一项功能。请参阅Indexing vectors and arrays with +:)。这允许一个变量起始索引和范围的常量偏移
Array[N*index +: N ] = Vector[index];
reg [M*N:0] Array;
integer index;
always @* begin // Verilog-2001 style sensitivity list
for(index=0; index <= M; index = index + 1) begin
Array[index*N +: N ] = Vector[index];
end
endgenerate
生成循环分配
第三种方法是使用generate
块(也在IEEE1364-2001中添加)。生成块for循环在详细说明时解开。如果Array[N*(index+1) : N*index ] = Vector[index];
是index
,则可以使用genvar
形式:
或者使用生成块
wire [M*N:0] Array; // note 'wire'
generate
genvar g_index; // The 'g_' prefix is suggested coding style to identified genvars
for(g_index=0; g_index <= M; g_index = g_index + 1) begin
assign Array[(g_index+1)*N] : g_index*N] = Vector[g_index];
//assign Array[g_index*N +: N ] = Vector[g_index]; // +: also works
end
endgenerate
SytemVerilog(IEEE1800)添加了位流,可以一步Array = {>>{Vector}};
执行操作,但我不知道它对于合成有多么常见。 (我通常在+:
中使用SystemVerilog的foreach
进行数组切片(always_comb
)