2013-02-03 98 views
3

有沒有連接兩個模塊端口而沒有實例化新線路的方法?Verilog:連接模塊端口,但沒有實例化新線路

小例子:

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比較模塊,而不會使用新線,是有某種隱含的連接?我真的需要一種方法來做這樣的事情,以便做到這一點: enter image description here

有很多模塊之間的電線。

+0

目前還不清楚您想如何將模塊連接在一起。 Verilog代碼中的信號與圖表中的信號不匹配。如果你展示瞭如何以長遠的方式來做,也許我們可以提出具體的建議。 – toolic

回答

1

我猜你想要一個模塊,以一種看起來像你的圖的方式多次實例化模塊comparator。你需要一個數組(在我的解決方案中是二維的)是由參數控制的寬度,以獲得最佳的靈活性。在generate塊內使用for-loopsif-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 
+0

太棒了,這正是我想要的 – Luca

1

IEEE Std(1364-2001)引入了generate構造以允許將多個實例連接在一起。

的IEEE標準(1800至2005年)介紹了「點星」(.*)語法,也被稱爲隱式端口連接,以減少佈線。如果您使用的是現代工具,則應該支持此SystemVerilog語法。