3

新しいワイヤをインスタンス化せずに 2 つのモジュール ポートを接続する方法はありますか?

ちょっとした例:

module comparator(max,min,in0,in1);

    input[7:0] in0,in1;
    output[7:0] max,min;

    wire[7:0] in0;
    wire[7:0] in1;
    wire[7:0] max;
    wire[7:0] min;

    assign max = (in0>in1) ? in0 : in1;
    assign min = (in0<in1) ? in0 : in1;

endmodule

新しいワイヤを使用せずに 2 つのコンパレータ モジュールを接続したいのですが、何らかの暗黙の接続はありますか? 私は本当にこのネットを行うためにそのようなことをする方法が必要です: ここに画像の説明を入力

モジュール間の配線が多すぎます。

4

2 に答える 2

1

IEEE Std(1364-2001)は、generate複数のインスタンスを相互に接続できるようにするための構造を導入しました。

.*IEEE Std(1800-2005)は、配線を減らすために、暗黙のポート接続とも呼ばれる「ドットスター」()構文を導入しました。最新のツールを使用している場合は、このSystemVerilog構文をサポートしている必要があります。

于 2013-02-03T13:59:26.507 に答える
1

comparator図のようにモジュールを何度もインスタンス化する 1 つのモジュールが必要だと思います。最高の柔軟性を得るには、パラメーターによって制御される幅の配列 (私のソリューションでは 2 次元) が必要です。generateブロック内ではfor-loopsandif-elseステートメントを使用して接続を行います。私のソリューションは、配列のスライスを使用します+:

これは IEEE Std (1800-2009) に準拠しており、IEEE Std (1800-2005) にも当てはまるはずです。

module comparator_list #(parameter int SIZE=10) (input logic [7:0] in [SIZE-1:0], output logic [7:0] out [SIZE-1:0]);
    generate
        if (SIZE==1) begin : pass_through
            always_comb out = in;
        end : pass_through
        else if (SIZE==2) begin : simple
            comparator c0 ( .max(out[0]), .min(out[1]), .in0(in[0]), .in1(in[1]) );
        end : simple
        else if (SIZE%2==1) begin : odd_list
            logic [7:0] in_buf [SIZE:0];
            logic [7:0] out_buf [SIZE:0];
            always_comb begin : link_in
                foreach(in[idx]) in_buf[idx] = in[idx];
                in_buf[SIZE] = 8'h00; // force last entry to 'h0 if unasigned, 'h80 if signed
            end : link_in
            always_comb begin : link_out
                foreach(out[idx]) out[idx] = out_buf[idx];
                // Note: out_buf[SIZE] is don't care
            end : link_out
            comparator_list #(SIZE+1) cl (.in(in_buf), .out(out_buf));
        end : odd_list
        else begin : even_list
            logic [(SIZE/2)*8-1:0] top [SIZE+1];
            logic [(SIZE/2)*8-1:0] bot [SIZE+1];

            for(genvar idx=0; idx<SIZE/2; idx+=1) begin : map
                always_comb {top[0][idx*8+:8],bot[0][idx*8+:8]} = {in[2*idx],in[2*idx+1]};
                always_comb {out[2*idx],out[2*idx+1]} = {top[SIZE][idx*8+:8],bot[SIZE][idx*8+:8]};
            end : map

            for(genvar stage=0; stage<SIZE; stage++) begin : link
                if(stage%2==0) begin : even
                    comparator c0[SIZE/2-1:0] (
                        .max(top[stage+1][0+:(SIZE/2)*8]), .in0(top[stage][0+:(SIZE/2)*8]),
                        .min(bot[stage+1][0+:(SIZE/2)*8]), .in1(bot[stage][0+:(SIZE/2)*8]) );
                end : even
                else begin : odd
                    assign top[stage+1][7:0] = top[stage][7:0];
                    comparator c1[SIZE/2-2:0] (
                        .max(bot[stage+1][0+:(SIZE/2-1)*8]),
                        .min(top[stage+1][8+:(SIZE/2-1)*8]),
                        .in0(bot[stage][0+:(SIZE/2-1)*8]),
                        .in1(top[stage][8+:(SIZE/2-1)*8])
                    );
                    assign bot[stage+1][(SIZE/2-1)*8+:8] = bot[stage][(SIZE/2-1)*8+:8];
                end : odd
            end : link
        end : even_list
    endgenerate
endmodule : comparator_list
于 2013-02-16T03:39:49.930 に答える