始终循环 Verilog

Always loop Verilog

这是我的 Verilog 代码,用于将数字 x 转换为形式 x=a0*R+a1 ,e.g 51 = 5*10 +1。我的代码不行,不能进入always循环。

`timescale 1ns / 1ps
module poly(
    input [15:0] r,
    input [15:0] x,
    output  reg[15:0] a1,
    output reg [15:0] a0,
    output finish,
    input clk,
    input reset
);

reg [15:0] sum;

assign finish =(sum > x);
always@ (posedge clk )
begin
    if(reset)
    begin 
        a0 <=0;
        sum <=0;
    end     
    else if (!finish)
    begin 
        a0 <=a0+1;
        sum <= sum+r;
    end
    else 
        a1<=x-sum;
end

initial begin
    $monitor ( "a1=%b,a0=%b,finish=%b,reset=%b",a1,a0,finish,reset);
end

endmodule 

测试平台

`timescale 1ns / 1ps

module tb_p;

    reg [15:0] r;
    reg [15:0] x;
    wire[15:0] a1;
    wire [15:0] a0;
    wire finish;
    reg clk;
    reg reset;

    initial clk=0;
    always #5 clk=!clk;

    poly m1(r,x,a1,a0,finish,clk,reset);

    initial begin
        r<=10;
        x <=17;
        #1 reset<=1;
        #2 reset<=0;
    end

endmodule

由于您的复位信号与时钟同步,因此您需要扩展它,使其至少在时钟的一个上升沿处于高电平:

initial begin
    r<=10;
    x <=17;
    #1 reset<=1;
    #20 reset<=0;
    #500 $finish;
end

请注意,我添加 $finish 只是为了让我的模拟结束。