忍者ブログ

雑記

【SystemVerilog】Interface bind

雑記 > codeのメモ > 【SystemVerilog】Interface bind

Interface bind

Interfaceに対してプロトコルチェックのようなSVAをbindするときに、moduleでbindができず、interfaceにSVAを記述してInterfaceにInterfaceでbindした例。


// ---------------------------------------------------------------------------
// struct
typedef struct packed {
  logic [7:0] Command ;
  logic         param_a   ;
} st_PaketA ;
typedef struct packed {
  logic [7:0] Command ;
  logic [1:0] param_b   ;
} st_PaketB ;
// --------------------------------------------------------------------------- 
// Interface design用
interface vldrdy #(parameter type st_Type=byte) ();
  logic vld ;
  logic rdy ;
  st_Type dat ;
  modport mst ( output vld,    input rdy, output dat );
  modport slv  (    input vld, output rdy,    input dat );
endinterface ;
// ---------------------------------------------------------------------------
// Interface SVA用 (bindでtypeを渡せない)
interface vldrdy_sva #(parameter W=8) (
  input bit                  clk ,
  input bit                  rst_n ,
  input logic              vld ,
  input logic              rdy ,
  input logic [W-1:0] dat
);
  // Stable and Pressure
  va_stable_dat : assign property ( @(posedge clk) ( vld&~rdy) |=> $stable(dat) ) ;
  va_stable_vld : assign property ( @(posedge clk) ( vld&~rdy) |=>              vld   ) ;
endinterface ;
// ---------------------------------------------------------------------------
// InterfaceにSVA用をbind
bind vldrdy vldrdy_sva #(.W($bits(vldrdy.dat))) vldrdy_sva(.*, .clk(top.clk),.rst_n(top.rst_n)) ;
// ---------------------------------------------------------------------------
// TOP - TestBench
// ---------------------------------------------------------------------------
module top();
  bit      clk ;
  bit      rst_n ;
  vldrdy #(.st_Type(st_PacketA)) vldrdy_ifA ();
  vldrdy #(.st_Type(st_PacketB)) vldrdy_ifB ();
  // -----------------------------------------------------------------------
  model_mst i_model_mst0 (.*, .PackA(vldrdy_ifA.mst), .PackB(vldrdy_ifB.mst));
  model_slv   i_model_slv0  (.*, .PackA(vldrdy_ifA.slv),  .PackB(vldrdy_ifB.slv));
  // -----------------------------------------------------------------------
  always begin #10 clk = ~clk ; end
  initial begin
    rst_n = 0 ;
    repeat(  3) @(negedge clk) ; rst_n = 1 ;
    repeat(20) @(negedge clk) ;
    #3 $finish() ;
  end
endmodule
// ---------------------------------------------------------------------------
// Slave
// ---------------------------------------------------------------------------
module model_slv (input logic clk, input logic rst_n, vldrdy.slv PackA, vldrdy.slv PackB);
  - 省略 -
endmodule
// ---------------------------------------------------------------------------
// Master
// ---------------------------------------------------------------------------
module model_mst (input logic clk, input logic rst_n, vldrdy.mst PackA, vldrdy.mst PackB);
  - 省略 -
endmodule

通常のインスタンスでは、type演算子でデータの型(構造体など)をparameterで渡すことができるが、bindではそれができず,代わりにbit幅を渡している。

ただ、プロジェクトが許すならDUTやRTLに直接SVAを書いた方がいい気がする


関連記事

コメント

カレンダー

11 2017/12 01
S M T W T F S
1
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31