忍者ブログ

雑記

【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を書いた方がいい気がする

関連記事

Code memo home

コメント

カレンダー

09 2018/10 11
S M T W T F S
1 2 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