Verilog @posedge时钟不工作
我正在学习Verilog,我正在实现一个半加法器,它应该只在时钟的正边缘出现时才改变输出,但结果会随输入而改变,而不是随时钟而改变 以下是程序代码:Verilog @posedge时钟不工作,verilog,clock,Verilog,Clock,我正在学习Verilog,我正在实现一个半加法器,它应该只在时钟的正边缘出现时才改变输出,但结果会随输入而改变,而不是随时钟而改变 以下是程序代码: module Full_adder_clk_chng( input a,b, clk, output sum,cout ); reg sum,cout; always @ (posedge clk) begin assign cout= a&b; assign sum=a ^b; end endmodule 下面是测试台代
module Full_adder_clk_chng(
input a,b, clk,
output sum,cout
);
reg sum,cout;
always @ (posedge clk)
begin
assign cout= a&b;
assign sum=a ^b;
end
endmodule
下面是测试台代码:
module tb2;
// Inputs
reg a;
reg b;
reg clk;
// Outputs
wire sum;
wire cout;
// Instantiate the Unit Under Test (UUT)
Full_adder_clk_chng uut (
.a(a),
.b(b),
.clk(clk),
.sum(sum),
.cout(cout)
);
initial begin
clk=0;
end
always begin
#5; clk=~clk;
end
initial begin
// Initialize Inputs
a = 0;
b = 0;
#20;
a=1;
b=0;
#23;
a=0;
b=0;
#25;
a=1;
b=1;
#3;
a=0;
b=0;
#1;
a=1;
b=1;
#1;
a=0;
b=0;
#1;
a=1;
b=1;
#20;
$finish;
end
endmodule
assign
关键字创建了连续赋值。如果放置在程序代码(如always块)中,则连续赋值将在程序代码执行时开始。在这种情况下,正边缘时钟持续重新启动连续分配
当程序分配
是必要的时,这是一种罕见的情况。加入最新的LRM程序assign
/deassign
被认为是不可取的,理由是它可能“低效、易被滥用,并且是设计问题的根源”§C.4(注:2009年IEEE合并了Verilog和SystemVerilog)
要在每个正边缘时钟上更新
cout
和sum
,只需省略assign
。由于这是同步逻辑,因此重新开始使用非阻塞分配(连续分配创建的分配
关键字。如果放置在过程代码中(例如始终块)当程序代码执行时,连续分配开始。在这种情况下,正边缘时钟持续重新启动连续分配
当程序性分配
是必要的时,这是一种罕见的情况。加入最新的LRM程序性分配
/解除分配
被认为是不可取的,理由是它可能“低效、易被滥用,并且是设计问题的根源”§C.4(注:2009年IEEE合并了Verilog和SystemVerilog)
要在每个正边缘时钟上更新cout
和sum
,只需省略assign
。由于这是同步逻辑,因此重新开始使用非阻塞分配(
always @ (posedge clk)
begin
cout <= a&b;
sum <= a^b;
end