モジュールの接続 ~ 概要 ~

Verilog−HDL では名前によるポート接続と順番によるポート接続の2種類がありました。 SystemVerilog では新たに .name と .* の2種類のポート接続が追加されました。

.name によるtポート接続

.name は名前によるポート接続をより簡単化したものです。 モジュール接続の記述において、ポート名とネット名が同一であるケースが非常に多く見受けられます。 .name を使うと、ポート名とネット名が同一である場合はポート名を記述すればよく、接続するネット名を省略できます。

なお、ポート名とネット名が一致しない信号については、名前によるポート接続と組み合わせて記述することができます。

  Verilog-HDL 名前によるポート接続     SystemVerilog .name によるポート接続  
  CNT6   CNT6 (
    .CLK    ( CLOCK ),
    .RST_X  ( RST_X ),
    .CNT_EN ( CNT_EN ),
    .CNTOUT ( CNTOUT )
  );
  CNT6   CNT6 (
    .CLK    ( CLOCK ),
    .RST_X,
    .CNT_EN,
    .CNTOUT
  );

.* によるポート接続

.* は .name をさらに簡単にしたものです。 ポート名とネット名が同一である場合、ポート名も省略して .* のみを記述します。 ポート名とネット名が異なる場合は、 .nameと同じように名前によるポート接続と組み合わせて記述することができます。

  CNT6   CNT6 (
    .*,
    .CLK    ( CLOCK ),
  );

interface

SystemVerilog では、新たに interface という概念が取り入れられました。モジュール間で共通の信号を interface で記述して呼び出すことで簡素化され、修正も楽になります。

SystemVerilog_interface

BUS_IF.sv

  interface #(parameter width=32) BUS_IF (input logic CLK, RST_X);
    logic [7:0]         ADDR;
    logic               WRITE;
    logic               ENABLE;
    logic [width-1:0]   WDATA;
    logic [width-1:0]   RDATA;
    logic               READY;
    modport MSTR_PORT (                   output ADDR, WRITE, ENABLE, WDATA, input  RDATA, READY);
    modport SLV_PORT  ( input CLK, RST_X, input  ADDR, WRITE, ENABLE, WDATA, output RDATA, READY);
  endinterface


TOP.sv

  module TOP (input logic CLK, RST_X, logic [7:0] CFG, output logic [3:0] FLAG);
 
    BUS_IF #(32) BUS1(.CLK, .RST_X);
    BUS_IF #(16) BUS2(.CLK, .RST_X);
 
    Master MSTR( .CLK, .RST_X, .CFG, .FLAG, .BUS1(BUS1.MSTR_PORT), .BUS2(BUS2.MSTR_PORT) ) ;
    Slave SLV1( .BUS(BUS1.SLV_PORT) ) ;
    Slave SLV2( .BUS(BUS2.SLV_PORT) ) ;
 
  endmodule


Master.sv

  module Master (
    input  logic         CLK, RST_X,
    input  logic [7:0]   CFG,
    output logic [3:0]   FLAG,
    BUS_IF.MSTR_PORT     BUS1,
    BUS_IF.MSTR_PORT     BUS2
  );
 
  assign BUS1.ADDR   = ...
  assign BUS1.WRITE  = ...
  assign BUS1.ENABLE = ...
  assign BUS1.WDATA  = ...
 
  assign BUS2.ADDR   = ...
  assign BUS2.WRITE  = ...
  assign BUS2.ENABLE = ...
  assign BUS2.WDATA  = ...


Slave.sv

  module Slave (
    BUS_IF.SLV_PORT   BUS
  );
 
  Slave_sub  sub(.BUS);
 


Slave_sub.sv

  module Slave_sub (
    BUS_IF.SLV_PORT   BUS
  );
 
    assign BUS.RDATA = ...
    assign BUS.READY = ...