Verilog @posedge时钟不工作

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 下面是测试台代

我正在学习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 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