verilog 怎么对 寄存器组 赋初值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog 怎么对 寄存器组 赋初值相关的知识,希望对你有一定的参考价值。

用verilog定义一个寄存器组后,想对他赋值,该怎么办??

我写了如下程序
reg [7:0] mem [15:1];

assign lut[ 1 ] = 8'd52;
assign lut[ 2 ] = 8'd1;
assign lut[ 3 ] = -8'd29;
assign lut[ 4 ] = -8'd106;
assign lut[ 5 ] = -8'd45;
assign lut[ 6 ] = 8'd96;
assign lut[ 7 ] = 8'd77;
assign lut[ 8 ] = 8'd8;
assign lut[ 9 ] = -8'd13;
assign lut[ 10 ] = -8'd89;
assign lut[ 11 ] = -8'd82;
assign lut[ 12 ] = 8'd66;
assign lut[ 13 ] = 8'd98;
。。。。

编译后老是提示我错误:
Error (10673): SystemVerilog error at signal.v(5): assignments to unpacked arrays must be aggregate expressions

怎么回事?

一般这样的寄存器初始化都在复位时候:
always@(poesdge clk or negedge N_rst)
begin
if(!N_rst)
begin
lut[ 1 ]< = 8'd52;
lut[ 2 ] <= 8'd1;
……
end
else
……
end
参考技术A 有一个系统任务可以支持初始化一个寄存器阵列的.好像是$readmemb (寄存器组名,初始化文件名).这个系统任务本身的资料建议你去看一下夏宇文的书,而产生的效果则跟你用的芯片所对应的开发软件有关,比如说用于初始化的数据文件应该保存在什么地方,是否需要加后缀名等等. 参考技术B 你的定义和赋值冲突了,你既然定义了reg型,就不能用assign语句对其赋值,assign只能为wire型参数进行赋值 参考技术C 要是你准备按assign赋值,就把最上头的定义改成wire [7:0] mem [15:1];
要么就改下面的assign为always
参考技术D 放在ALWAYS里面赋值。REG型不能用ASSIGN。

Verilog里面如何初始化数组才能被Quartus II综合?

Verilog里面如何初始化数组才能被Quartus II综合?
比如我有一个常数数组
reg [8:0] conval [15:0];
conval的值在系统运行中不变的,quartus不支持initial语句,那我如何对conval赋初值?

reg [7:0] conval[15:0]表示定义(或者叫声明)了一个名为conval的存储器,该存储器一共包含16个寄存器,每个寄存器可以存储一个8位的二进制数。

在verilog中,每次只能对存储器中的某个寄存器赋值,不能一次性对整个存储器赋值。
例如你可以写conval[9]<=8'hff,但不能写conval[15:0]<=……
所以,楼主如果真要给存储器conval赋初值,也只能一个寄存器一个寄存器地赋了。

另外需要再说明的是:verilog不支持对存储器进行位访问(或者叫位寻址)。
例如你写Medied<=conval[9][3],是不对的。
——Medied.Lee
参考技术A 一般的综合如果不在意上电时的值,编译器会向着面积最小的方向综合,那样综合后信号的初始值是不确定的。
module test(
input wire rst_n // Reset, Active Low
,input wire clk
//
// Add other inputs and outputs here
//
);
integer k;
parameter n = 10; // set the value of n here
reg signed [20:0] e[0:n-1];
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
for(k=0;k<n;k=k+1) e[k] <= 21'h0; // set initial value of matrix to all zero here
end
else begin
// change the value of e here normally
end
end

endmodule
参考技术B always@(negedge rst)
begin

if(!rst)

conval=16'hXXXX;
..........

end
参考技术C 用parameter进行初始化 参考技术D 复位时候赋初值本回答被提问者采纳

以上是关于verilog 怎么对 寄存器组 赋初值的主要内容,如果未能解决你的问题,请参考以下文章

verilog中如何实现上电复位给寄存器赋初值?

verilog的寄存器默认初始值是多少?

verilog模块端口为二维数组如何调用?

Verilog里面如何初始化数组才能被Quartus II综合?

systermverilog中二维数组含义

问个verilog二维寄存器初始化的问题