我对Verilog编程完全陌生,我不明白在哪里初始化reg
变量?
让我们看一下以下片段: 编辑: Warning at synthesize
module test (
output LED0
);
reg led = 1'b1;
assign LED0 = led;
endmodule
或
module test (
output LED0
);
reg led;
initial begin
reg led <= 1'b1;
end
assign LED0 = led;
endmodule
给我:使用led的初始值,因为它从未在行分配:reg led = 1'b1;
{@ 1}}类型是否仅在always @ block中分配?
另一个例子:
reg
这里reg的初始值为0,但我之前将它设置为1 ......出了什么问题?谢谢!
答案 0 :(得分:1)
是否只在always @ block中分配了reg类型?
不,reg
种类可以在always
块和initial
块(加task
和function
中分配,但我会在范围内跳过它们这个问题)
对于fourBitCounter
,reg[3:0] counter
块中声明的initial
会创建一个名为counter
的局部变量,该变量只能在创建块的范围内访问in。您需要删除初始块中的reg[3:0]
,以便将分配应用于预期的counter
。但它仍然无效,因为您将counter
声明为推断的导线类型,而always
/ initial
块无法分配导线。
counter
被声明为4位推断线的输出(output [3:0] counter
是output wire [3:0] counter
的同义词)。由于在counter
块和always
块中分配了initial
,因此它必须是reg
类型。因此,它应声明为output reg [3:0] counter
。
此外,您在输入和本地线路中声明clk
,它不能同时为两者。可以在本地访问端口,没有理由将它们重新声明为本地网络。
仅供参考:对于4位值,15 + 1等于0,因为没有任何东西可以存储MSB。
module fourBitCounter (
input clk,
output reg [3:0] counter // 'output reg', not 'output'
);
//wire clk; // do not do this, clk is an input
initial begin
counter = 4'b1; // no 'reg' here
end
always @(posedge clk) begin
if(counter > 15) // this will never evaluate as true with counter declared as 4-bit
counter <= 0;
else
counter <= counter + 1;
end
endmodule
对于Verilog,assign
语句只能应用于网络类型(例如wire
)。这是合法的:
module test ( output LED0 ); // LED0 is an inferred wire
assign LED0 = 1'b1;
endmodule
这是非法的:
module test ( output reg LED0 ); // Explicit reg
assign LED0 = 1'b1; // illegal, assign on a reg
endmodule
答案 1 :(得分:0)
从您的第一个代码示例:
reg led; // <-- This declares one register called "led"
initial begin
reg led <= 1'b1; // <-- This declares a *separate* register called "led"
end // which is only valid in the initial block
第二个样本中存在同样的问题;您在initial
块中声明了一个单独的寄存器。如果您只是尝试分配值,请不要使用关键字reg
或wire
。