如何将reg值映射到其他模块的端口

时间:2013-02-06 09:34:05

标签: verilog

我是verilog的业余爱好者。我试图调用模块分频器。但我在综合中得到的错误如“参考矢量reg'qtnt'不是合法的净值左右”。我曾尝试使用电线作为输入,但当我尝试为它们分配值时,收到了错误消息。请帮忙

module euclid_mul(
  input[9:0] p0,p1,q0,
  input[19:0] tot,
  input clk,
  output reg [20:0] p2,
  output reg out_en,o1,o2
);
reg[20:0] dvr,dvd,qtnt,rem;
reg[9:0] ph;
reg[20:0] mul,res;
reg enable,f1;

initial f1=0;
initial enable=0;

divider div2(dvd,dvr,enable,qtnt,rem,f1);   

always @ (negedge clk)
  begin 
    if(f1==0) begin
      mul=q0*p1;
      ph=p0;
      res={11'b00000000000,ph[9:0]}-mul;
      if(res[20])
        begin
          o1=1;
          dvd=-res;
        end
      else
        dvd=res;
        o2=1;
        dvr=tot;
        enable=1;
      end
    end

    always @(posedge f1)
      begin
        if(res[20]) 
          begin 
            p2=tot-rem;
            out_en=1;
          end
        else
          begin
            p2=rem;
            out_en=1;
          end
        end
      endmodule

1 个答案:

答案 0 :(得分:1)

如果您格式化代码以便更容易阅读,则可能会获得更多响应。如下所示:

我还指出了一个部分,我认为你错过了一个开头和结尾的陈述。 同样在时钟部分内,您经常需要使用非阻塞分配<=

由于你没有提供分频器模块,我宁愿看到命名而不是按顺序指定的端口,它可能有助于我们知道它可能做什么,甚至更好地用它的方向和宽度标记它。

module euclid_mul(
  input       [9:0] p0,p1,q0,
  input      [19:0] tot,
  input             clk,
  output reg [20:0] p2,
  output reg        out_en,o1,o2
);
reg [20:0] dvr,dvd,qtnt,rem;
reg  [9:0] ph;
reg [20:0] mul,res;
reg        enable,f1;

initial begin
  f1     = 0;
  enable = 0;
end

divider div2(dvd,dvr,enable,qtnt,rem,f1);   
// My prefered style to help us understand conectivity.
//divider
//  divider_i0(
//    .divisor( dvd ), //input  [20:0]
//    .result ( res )  //output [20:0]
//);


always @ (negedge clk) begin 
  if(f1==0) begin
    mul = q0*p1;
    ph  = p0;
    res = {11'b00000000000,ph[9:0]}-mul;
    if ( res[20] ) begin
      o1  = 1;
      dvd = -res;
    end
    else begin //There was a missing begin
      dvd   = res;
      o2    = 1;
      dvr   = tot;
     enable = 1;
    end //Missing End
  end
end

always @(posedge f1) begin
  if(res[20]) begin 
    p2     = tot-rem;
    out_en = 1;
  end
  else begin
    p2     = rem;
    out_en = 1;
  end
end
endmodule

输入可以是reg,并且可以从始终或初始块内部驱动,也可以从单个assign或其他模块输出驱动的线路驱动。

输出应始终连接到电线,模块驱动它们。