【问题标题】:how to map reg values to the ports of other module如何将 reg 值映射到其他模块的端口
【发布时间】:2013-02-06 09:34:05
【问题描述】:

我是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

【问题讨论】:

  • 模块div2的第4个端口是输入还是输出。如果它是一个输入,你应该将一些东西连接到它。如果它是一个输出,它可以保持打开状态,但如果你真的不需要那个输出,你应该检查你的设计。
  • 第 4 个端口是输出端口。我的问题是我用作 div2 实例化输入的值是 reg 值而不是净值。所以请告诉我如何将 reg 值分配给在 always 块中连线或如何使用 reg 值作为实例化模块的输入。
  • 要让 sim 运行,断开所有与 div2 的连接,将输入绑定到 0,保留输出。然后开始添加您认为正确的内容,直到您看到语法错误。

标签: verilog


【解决方案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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2011-08-07
    • 2014-12-14
    相关资源
    最近更新 更多