以下是用于集成 AXI VIP 以在簡單定向環境中開始驗證 AXI 接口的步驟。這種定向測試方法也實現了良好的性能。
下面的測試平臺示例顯示了一個連接到 DUT 從機的 AXI 主 VIP。實際示例還使用 VIP 代替從屬 DUT 。
1) 導入并包含所需的 VIP 包/文件
Synopsys 的 VIP 以 SystemVerilog 包的形式提供。這些包為 VIP 定義唯一的命名空間,但為了使 VIP 更易于使用,可以將 VIP 命名空間導入到全局命名空間中。除了SystemVerilog軟件包之外,SVT VIP的某些方面(如SystemVerilog接口)作為全局文件交付,必須包含這些文件,因為它們必須同時存在于設計和測試平臺域中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
`include "uvm_pkg.sv" `include "svt_axi_if.svi" /** Include the AXI SVT UVM package */ `include "svt_axi.uvm.pkg" module test_top; /** Import UVM Package */ import uvm_pkg::*; /** Import the SVT UVM Package */ import svt_uvm_pkg::*; /** Import the AXI VIP */ import svt_axi_uvm_pkg::*; … … endmodule |
2) 將 VIP 接口連接到 DUT 信號
VIP提供SystemVerilog接口,提供所需的信號連接。必須聲明這些接口的實例,并且來自這些接口的信號必須連接到 DUT。在這個例子中,主(vip)和從(vip)都是背靠背連接的??梢暂p松地將所需的VIP模型替換為相應的DUT模型。
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
|
/** VIP Interface instance representing the AXI bus */
svt_axi_if axi_if();
assign axi_if.common_aclk = SystemClock;
/** Testbench reset */
logic tb_reset;
/**
* Assign the testbench reset to the reset pins of the VIP
* interface.
*/
assign axi_if.master_if[0].aresetn = tb_reset;
/* connection from master[0] to slave[0], connected back to back */
assign axi_if.slave_if[0].awvalid = axi_if.master_if[0].awvalid;
assign axi_if.slave_if[0].awaddr = axi_if.master_if[0].awaddr;
…
assign axi_if.master_if[0].arready = axi_if.slave_if[0].arready;
assign axi_if.master_if[0].rvalid = axi_if.slave_if[0].rvalid;
assign axi_if.master_if[0].rlast = axi_if.slave_if[0].rlast;
…
… /** make rest of assignments (you can alternately choose the SystemVerilog bind approach /** for that you can refer to “amba_svt/tb_axi_svt_uvm_intermediate_sys” /** example from VIP installation |
3) 為異議管理和 UVM 低執行創建虛擬 UVM 測試
Directed_test是一個虛擬測試,可以擴展uvm_test。這允許 UVM 階段機制執行,并使用事件 (end_test) 同步管理在程序塊中編寫的定向測試的運行階段的異議。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Directed_test extends uvm_test;
/** UVM Component Utility macro */
`uvm_component_utils(Directed_test)
/** Class Constructor */
function new(string name = "Directed_test", uvm_component parent=null);
super.new(name,parent);
endfunction: new
//Objection management co-ordinated by uvm_test
virtual task run_phase(uvm_phase phase);
super.run_phase(phase);
phase.raise_objection(this);
@end_test; //this event will be triggered by directed test from initial-begin-end block
phase.drop_objection(this);
endtask endclass |
4) 實例化 VIP 組件
必須構造和配置主 VIP 代理類和從屬 VIP 代理類。初始化這些配置對象后,將使用 UVM 資源數據庫將它們發送到 UVM 層次結構中的相應代理實例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
initial begin
`uvm_info("Directed_test", "Entered...", UVM_MEDIUM)
master_0 = svt_axi_master_agent::type_id::create("master_0",null);
master_cfg0 = svt_axi_port_configuration::type_id::create("master_cfg0",null);
/** set required interface for agent instances */
master_cfg0.set_master_if(axi_if.master_if[0]);
master_cfg0.data_width = 256;
/**Pass master and slave configuration using resource database */
uvm_config_db#(svt_axi_port_configuration)::set(null, "*master_0", "cfg", master_cfg0); |
5) 開始 UVM 執行
UVM run_test() 方法啟動 UVM 執行,并且它的參數用作要執行的默認測試。
1
2
3
4
|
/** Start the UVM execution */ fork
run_test("Directed_test"); join_none |
6) 重置 DUT DUT
重置代碼必須在執行任何事務之前調用/執行。
1
2
3
4
5
6
7
8
|
/* Reset logic */ `uvm_info("reset_logic", "Entered...", UVM_LOW) tb_reset = 1'b1; repeat(10) @(posedge SystemClock); tb_reset = 1'b0; repeat(10) @(posedge SystemClock); tb_reset = 1'b1; `uvm_info("reset_logic", "Exiting...", UVM_LOW) |
7) 從主站發起流量
現在,我們已準備好開始從主節點創建事務。下面的示例創建一個 WRITE 事務,設置所有必填字段,并使用 execute_item() 方法將其發送到 VIP 主驅動程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/* Create and Send atomic transaction */
`uvm_info("atomic_transation", "Entered...", UVM_MEDIUM)
begin
svt_axi_master_transaction axi_trans;
axi_trans = new();
axi_trans.port_cfg = cfg.master_cfg[0];
axi_trans.xact_type = svt_axi_transaction::WRITE;
axi_trans.addr = 32'h0000_0000;
axi_trans.burst_type = svt_axi_transaction::INCR;
axi_trans.burst_size = svt_axi_transaction::BURST_SIZE_32BIT;
axi_trans.atomic_type = svt_axi_transaction::NORMAL;
axi_trans.burst_length = 16;
axi_trans.data = new[axi_trans.burst_length];
axi_trans.wstrb = new[axi_trans.burst_length];
/** Send the atomic write transaction */
master_0.sequencer.execute_item(axi_trans); //send axi transaction to driver
`uvm_info("atomic_transation", "Ended...", UVM_MEDIUM)
end |
8 ) 觸發測試結束
end_test事件用于使 run_phase() 引發的異議能夠刪除。這表示運行階段結束,其余的 UVM 階段將在運行階段完成后執行。這表示測試結束。
1
2
3
4
|
//Trigger uvm end of test
end_test;
`uvm_info("Directed_test", "Exited...", UVM_MEDIUM) end |
審核編輯:郭婷
-
接口
+關注
關注
33文章
8691瀏覽量
151679 -
Synopsys
+關注
關注
2文章
158瀏覽量
90224 -
DUT
+關注
關注
0文章
189瀏覽量
12460
發布評論請先 登錄
相關推薦
評論