多个模块实例化声明和函数verilog

时间:2017-03-27 10:03:10

标签: verilog

我已经实例化了4个模块。调用的第三个模块没有输入,if块输入变为零,但是当模块单独执行而没有从该主模块调用时,它运行正常。任何人都可以告诉我为什么它没有得到输入?
请通过第三个模块

module one(u,v,p,x,x2,rx,clk,rem);
input [15:0]u,v,p;
input clk;
output wire [15:0]rx,rem;
output wire [31:0]x,x2;
rcalci inst(.p(p),.clk1(clk),.r(rx));
vedic_16x16 inst2(.a(u),.b(rx),.c(x));
division1 inst3(.n(x),.d(p),.clk2(clk),.r(rem));
vedic_16x16 inst4(.a(v),.b(rx),.c(x2));
endmodule

module division1(n,d,clk2,r);
input [31:0]n;
input [15:0]d;
output [15:0]r;
reg [15:0]r,q;
reg [15:0]n1,n2;
input clk2;
integer i=0;
reg [1:0]flag;
initial
    flag=0;
always @(posedge clk2)
begin
    if(flag==0)
    begin
        n1[15:0]=n[31:16];
        n2[15:0]=n[15:0];
        flag=1;
    end

    if(flag==1)
    begin
        r=n2[15:0];    
        if(i<16)
        begin
            n1[15:0]={n1[14:0],n2[15]};
            n2=n2<<1;

            if(n1>=d)
            begin
                n1=n1-d;
                n2[0]=1;
                //q=n2;
            end

        end
        i=i+1;
        if(i>=16)
            flag=2;
    end
end
endmodule

1 个答案:

答案 0 :(得分:0)

division1输入n仅在第一个时钟上采样,一旦完成一个除法,则不执行其他操作。此输入源自rx,它似乎由同一时钟更新。 ndivision1采样时,flag极不可能具有预期值。

我不知道您的代码的意图。一种选择是将i设置为0而不是2并重置<=,以便再次进行除法。另一种选择是在后一个时钟边缘开始除法。我猜你想要第一个选择。

此外,应为顺序逻辑分配非阻塞分配(=)而不阻塞(@FirstTable)。