如何在verilog中将输入从电线存储到reg中?

How to store input into reg from wire in verilog?

我正在尝试将名为 'in' 的电线的值存储到寄存器 'a' 中。 但是,问题是 reg 'a' 的值在模拟器中显示为 'xxxx'。但是,电线 'in' 的值显示正确。 我的目标只是从输入线读取值并将其存储到寄存器中。

module test(
input [3:0] in,
output [3:0] out
);
reg [3:0] a;

initial
begin
a = in;
end
endmodule

之所以a的值在模拟中是'xxxx',大概是因为a只设置了一次in的值最初,并且a此时可能尚未在模拟中设置为任何特定值。


在Verilog中声明一个reg并不一定意味着代码描述了一个硬件寄存器。这通常涉及使用时钟信号:

module test(
  input clk,
  input [3:0] in,
  output [3:0] out
);

// this describes a register with input "in" and output "a"
reg [3:0] a;
always @(posedge clk) begin
  a <= in;
end

// I assume you want "a" to be the output of the module
assign out = a;

endmodule

这是一个反例,其中 reg 用于描述不是寄存器的东西,而只是简单的连线:

module not_a_register(
  input in,
  output out
);

reg a;
always @(in) begin
  a <= in;
end

assign out = a;

endmodule

另请注意,我在 always 块内使用了非阻塞赋值运算符 <=,这在描述同步逻辑时是个好习惯。您可以阅读更多相关信息 here