ただいまコメントを受けつけておりません。
雑記 > codeのメモ > 【SystemVerilog】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を書いた方がいい気がする
ただいまコメントを受けつけておりません。