Verilog:Procedural 不支持寄存器连续赋值
Verilog:Procedural Continuous Assignment to register is not supported
input [31:0] write_data;
input [4:0] write_reg;
reg [31:0] registers [31:0];
always @(*)
assign registers[write_reg] = write_data;
我有一个 32 位输入 write_data ,我想分配相应的索引,我从写入中得到 reg.Error 说你不能做连续赋值,我认为这是由 always@( *) 但如果我删除那个
它说
赋值左侧的对象 "registers" 必须具有网络类型
这是另一个错误。
您需要同步分配给寄存器。因为合成器解析它并路由到物理寄存器(即触发器)
always @(posedge clk)
my_reg = my_data;
assign
在 中,一个始终块是 procedural assignment
。它不可 可综合,不应使用。它适用于非常特殊的建模案例。
continuous assignment
或 assign
在 之外,always 块用于连接 nets
并在所有地方使用。这种分配的 lhs 必须是 net 类型,即 wire。它不能是 reg.
另一方面,always 块中的所有 lhs 必须是 'reg' 类型。
在您的案例中,您必须做的是删除关键字 assign:
input [31:0] write_data;
input [4:0] write_reg;
reg [31:0] registers [31:0];
always @(*)
registers[write_reg] = write_data;
input [31:0] write_data;
input [4:0] write_reg;
reg [31:0] registers [31:0];
always @(*)
assign registers[write_reg] = write_data;
我有一个 32 位输入 write_data ,我想分配相应的索引,我从写入中得到 reg.Error 说你不能做连续赋值,我认为这是由 always@( *) 但如果我删除那个
它说 赋值左侧的对象 "registers" 必须具有网络类型 这是另一个错误。
您需要同步分配给寄存器。因为合成器解析它并路由到物理寄存器(即触发器)
always @(posedge clk)
my_reg = my_data;
assign
在 中,一个始终块是 procedural assignment
。它不可 可综合,不应使用。它适用于非常特殊的建模案例。
continuous assignment
或 assign
在 之外,always 块用于连接 nets
并在所有地方使用。这种分配的 lhs 必须是 net 类型,即 wire。它不能是 reg.
另一方面,always 块中的所有 lhs 必须是 'reg' 类型。
在您的案例中,您必须做的是删除关键字 assign:
input [31:0] write_data;
input [4:0] write_reg;
reg [31:0] registers [31:0];
always @(*)
registers[write_reg] = write_data;