0

私はVerilogのアマチュアです。モジュールディバイダーを呼び出そうとしています。しかし、合成時に「vectorreg'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
4

1 に答える 1

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または別のモジュール出力から駆動されるワイヤである可能性があります。

出力は常にワイヤに接続する必要があり、モジュールがそれらを駆動します。

于 2013-02-06T16:43:06.750 に答える