1. ホーム
  2. module

[解決済み] Verilog エラー。構造ネット式に接続する必要があります

2022-02-28 08:46:03

質問

エラーが発生するのですが。 output or inout port "Qout" must be connected to a structural net expression . 以下のコードでエラーが発生した行をコメントアウトしています(コードはトリミング/圧縮されています)。Qをwireにすれば解決すると思うのですが、Qは8BitRegisterモジュールのalways-blockの一部なので、regでなければなりません。 どうすればこのエラーを回避できるでしょうか?

`timescale 1ns / 1ns

module lab4_3(SW, KEY, LEDR);
    input [9:0] SW;
    input [3:0] KEY; 
    output [7:0] LEDR;

    eightBitRegister eight1(
                .DATA_IN(SW[7:0]),
                .parallelloadn(KEY[1]),
                .rotateRight(KEY[2]),
                .clock(KEY[0]),
                .reset(SW[9]),
                .Q(LEDR[7:0])       
    );      
endmodule

module eightBitRegister(DATA_IN, parallelloadn, rotateRight, reset, clock, Q);
    input [7:0] DATA_IN;
    input parallelloadn;
    input rotateRight;
    input reset;
    input clock;
    output[7:0] Q;


    register reg0(.Qout(Q[0]),  //GETTING ERROR HERE
                .right(Q[1]),
                .left(Q[7]),
                .D(DATA_IN[0]),
                .loadleft(rotateRight),
                .loadn(parallelloadn),
                .clk(clock),
                .rst(reset));

   reg [7:0] Q;
    always @(*)
    begin
     case({parallelloadn,rotateRight})
        2'b00: Q = DATA_IN; 
        2'b01: Q = DATA_IN;  
        2'b11: Q = Q >> 1;
        2'b10: Q = Q << 1;
     endcase
    end

endmodule

module register(Qout, right, left, D, loadleft, loadn, clk, rst);
    input right, left;
    input D;
    wire datato_dff, rotatedata;
    input loadleft, loadn;
    input clk, rst;
    output Qout;

flipflop F0( 
    .d(datato_dff), 
    .q(Qout), 
    .clock(clk),
    .reset(rst) 
);

module flipflop(d, q, reset, clock); 
    input reset, clock;
    input d;
    output q;
    reg q;
    always @(posedge clock)
    begin
        if (reset == 1'b0) 
            q <= 0; 
        else 
            q <= d; 
    end

endmodule

解決方法は?

まず最初に endmodule の後にある flipflop F0 のインスタンス化です。Verilog では、ネストされたモジュールはサポートされていません(タイポエラーの可能性があります)。

次に Qout は複数のドライバで駆動します。あなたが駆動している Qout から .Qout(Q[0]) レジスタモジュールから、そして always ブロックに格納されます。これは違法です。

モジュールの出力は、必ず wire . しかし Qout は出力ポートですが、ロジックの入力として使用されます。 Q . そこで register モジュールを駆動するために使用します。 QeightBitRegister モジュールになります。

以下の図は、入力ポート、出力ポート、および入力ポートに対するポート接続ルールを示しています。

あなたのコードを少し修正しました。ここでは、一時的なワイヤーを使用して回避しています。このコードは、次の場所で入手できます。 EDAPlayground .