Verilog 此代码上的意外行为,发生了什么? 模块myModule(时钟,A); 输入时钟; 输出寄存器[3:0]A=4'b0000; reg Sin=0; 始终@(posedge CLK) 开始 //Sin
它们不同,因为Sin是该表达式的注册版本(延迟一个周期) 您可以对Verilog 此代码上的意外行为,发生了什么? 模块myModule(时钟,A); 输入时钟; 输出寄存器[3:0]A=4'b0000; reg Sin=0; 始终@(posedge CLK) 开始 //Sin,verilog,Verilog,它们不同,因为Sin是该表达式的注册版本(延迟一个周期) 您可以对Sin使用连续赋值来获得相同的行为: module myModule (CLK, A); input CLK; output reg [3:0] A = 4'b0000; reg Sin = 0; always @(posedge CLK) begin Sin <= ((~A[2]&~A[1]&~A[0])|(A[2]&A[1])); A[0] <= A[1]; A[1] <=
Sin
使用连续赋值来获得相同的行为:
module myModule (CLK, A);
input CLK;
output reg [3:0] A = 4'b0000;
reg Sin = 0;
always @(posedge CLK)
begin
Sin <= ((~A[2]&~A[1]&~A[0])|(A[2]&A[1]));
A[0] <= A[1];
A[1] <= A[2];
A[2] <= A[3];
A[3] <= Sin;
//A <= {(~A[2]&~A[1]&~A[0])|(A[2]&A[1]), A[3], A[2], A[1]};
end
endmodule
模块myModule(时钟,A);
输入时钟;
输出寄存器[3:0]A=4'b0000;
导线Sin=(~A[2]&~A[1]&~A[0])|(A[2]&A[1]);
始终@(posedge CLK)
开始
A您的案例中有一个小差异,这使得两个部分的行为不同。Sin中的非阻塞分配
module myModule (CLK, A);
input CLK;
output reg [3:0] A = 4'b0000;
reg Sin = 0;
always @(posedge CLK)
begin
Sin <= ((~A[2]&~A[1]&~A[0])|(A[2]&A[1]));
A[0] <= A[1];
A[1] <= A[2];
A[2] <= A[3];
A[3] <= Sin;
//A <= {(~A[2]&~A[1]&~A[0])|(A[2]&A[1]), A[3], A[2], A[1]};
end
endmodule
module myModule (CLK, A);
input CLK;
output reg [3:0] A = 4'b0000;
wire Sin = (~A[2]&~A[1]&~A[0])|(A[2]&A[1]);
always @(posedge CLK)
begin
A <= { Sin, A[3], A[2], A[1] };
end
endmodule
Sin = ((~A[2]&~A[1]&~A[0])|(A[2]&A[1]));