色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

參數化接口和可重用VIP:第二部分

星星科技指導員 ? 來源:synopsys ? 作者:Aron Pratt ? 2023-05-29 10:31 ? 次閱讀

在本系列的第一部分中,介紹了SystemVerilog接口的基本概念,并描述了這些接口的參數化給測試平臺代碼帶來的問題。這篇文章將描述此問題的可能解決方法,但需要付出代價...

特洛伊木馬:偷襲方法

虛擬接口不支持多態性,因為它們與靜態設計元素相關聯。但是,SystemVerilog 類確實支持多態性,這一事實可用于創建接口訪問器類。

創建一個虛擬類,該類聲明在 SystemVerilog 接口上執行特定操作的純虛擬訪問器方法。然后,參數化類擴展此類以執行對強類型接口的實際訪問。VIP 代碼僅與非參數化基訪問器類交互,因此無需參數化 VIP 代碼即可使用強類型接口。測試平臺必須設置強類型訪問器類并將其傳遞給 VIP,但在此之后,無需參數化 VIP 即可執行與 VIP 的所有交互。以下代碼段演示如何進行此設置。

首先,我們定義參數化虛擬接口,該接口與上周代碼段中使用的接口相同:

1
2
3
4
5
6
7
8
9
10
11
12
13
interface param_if#(int width = 8);
logic clk;
logic[width-1:0] data;
clocking active_cb @(posedge clk);
default input #1 output #1;
output data;
endclocking
modport active_mp (clocking active_cb);
endinterface
typedef virtual param_if param_vif

接下來,我們定義非參數化接口訪問器類和參數化以使用參數化接口的擴展類:

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
//=======================================================================
virtual class port_wrapper extends uvm_object;
pure virtual task do_write(logic[31:0] data);
pure virtual task do_read(output logic[31:0] data);
pure virtual task sync_driver_cb();
endclass
//=======================================================================
class port_wrapper_typed#(type vif_t=param_vif) extends port_wrapper;
vif_t vif;
function new(vif_t vif);
this.vif = vif;
endfunction
virtual task do_write(logic[31:0] data);
vif.active_cb.data <= data;
endtask
virtual task do_read(output logic[31:0] data);
data = vif.active_cb.data;
endtask
virtual task sync_driver_cb();
@(vif.active_cb);
endtask
endclass

在此之后,實現 VIP 代碼以使用此訪問器類,而不是直接訪問虛擬接口。下面的代碼段展示了驅動程序和代理類,并演示了必須使用訪問器方法的各個位置。關于此VIP代碼需要注意的一件事是,它通過配置數據庫而不是接口接受非參數化訪問器類:

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
32
33
34
35
36
37
38
39
//=======================================================================
class cust_driver extends uvm_driver#(cust_data);
`uvm_component_utils(cust_driver)
port_wrapper port;
task consume_from_seq_item_port();
forever begin
seq_item_port.get_next_item(req);
port.do_write(req.data);
port.sync_driver_cb();
task sample_signals();
forever begin
bit[31:0] sampled_data;
port.do_read(sampled_data);
port.sync_driver_cb();
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(port_wrapper)::get(this, "", "port", port))
`uvm_fatal("build", "A valid port wrapper was not received.");
//=======================================================================
class cust_agent extends uvm_agent;
`uvm_component_utils(cust_agent)
cust_driver driver;
function void build_phase(uvm_phase phase);
port_wrapper port;
if (!uvm_config_db#(port_wrapper)::get(this, "", "port", port))
`uvm_fatal("build", "A valid port wrapper was not received.");
uvm_config_db#(port_wrapper)::set(this, "driver", "port", port);
driver = cust_driver::type_id::create("driver", this);

最后,給出了測試平臺代碼。測試用例可以在不參數化的情況下訪問 VIP,但實例化接口的頂級模塊確實必須實現一些額外的步驟。它不僅必須實例化參數化接口,還必須創建參數化接口訪問器類并將其傳遞給 VIP 實例:

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
32
33
34
35
36
37
//=======================================================================
class cust_test extends uvm_test;
`uvm_component_utils(cust_test)
cust_agent agent8;
cust_agent agent16;
cust_agent agent32;
virtual function void build_phase(uvm_phase phase);
agent8 = cust_agent::type_id::create("agent8", this);
agent16 = cust_agent::type_id::create("agent16", this);
agent32 = cust_agent::type_id::create("agent32", this);
endfunction
endclass
//=======================================================================
module test_top;
param_if#(8) if8();
param_if#(16) if16();
param_if#(32) if32();
initial begin
port_wrapper_typed#(virtual param_if#(8)) port_wrapper8;
port_wrapper_typed#(virtual param_if#(16)) port_wrapper16;
port_wrapper_typed#(virtual param_if#(32)) port_wrapper32;
port_wrapper8 = new(if8);
port_wrapper16 = new(if16);
port_wrapper32 = new(if32);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent8", "port", port_wrapper8);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent16", "port", port_wrapper16);
uvm_config_db#(port_wrapper)::set(uvm_root::get(), "uvm_test_top.agent32", "port", port_wrapper32);
run_test("cust_test");
end
endmodule

如您所見,此解決方案確實解決了參數化接口的使用模型問題。創建正確類型的端口包裝器需要一些額外的代碼,但是測試平臺編寫者可以訪問使用不同專用接口的代理,而無需知道這些接口是如何專用的。

但是,此解決方案對 VIP 如何使用虛擬接口施加了嚴格的限制。驅動程序和監視器類不能直接與接互,而必須將這些訪問推遲到強類型包裝類。通過將驅動程序和監視器類的大部分功能移動到強類型包裝類,可以抵消這種生產力損失;然而,這種更復雜的結構可能會令人困惑且不太靈活。上面的代碼段僅顯示了驅動程序類可能需要的幾個訪問方法,但在實際環境中,此列表可能會增長許多倍,并且監視器類也需要完整的訪問器方法。

經過反思,處理參數化接口的蠻力方法和特洛伊木馬方法都不是理想的。使用前一種方法,向類添加參數會使 VIP 的使用模型復雜化。在后面的方法中,必須提前規劃端口包裝類支持的訪問方法,并且對虛擬接口的 VIP 訪問受到限制。如果 VIP 代碼可以在不實際使用參數化接口的情況下啟用類似于參數化接口的功能,該怎么辦?

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8580

    瀏覽量

    151044
  • 監視器
    +關注

    關注

    1

    文章

    780

    瀏覽量

    33130
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110078
收藏 人收藏

    評論

    相關推薦

    實現免調整VCO1的IC (第二部分)

    實現免調整VCO1的IC (第二部分)
    發表于 05-07 13:18 ?46次下載

    AT91SAM9260使用手冊第二部分

    AT91SAM9260使用手冊第二部分
    發表于 03-10 09:13 ?86次下載

    常用單片機實例與仿真_第二部分

    第二部分 常用單片機實例與仿真 需要的下載
    發表于 11-10 17:37 ?13次下載

    微型模塊電源產品第二部分

    微型模塊電源產品第二部分,有需要的下來看看
    發表于 03-17 17:43 ?0次下載

    中國NB-IOT產業聯盟-第二部分問題清單-20160824

    中國NB-IOT產業聯盟-第二部分問題清單
    發表于 01-11 12:00 ?7次下載

    2012年PSoC數?;旌显O計培訓_第二部分

    2012年PSoC數?;旌显O計培訓_第二部分
    發表于 10-27 09:32 ?26次下載
    2012年PSoC數模混合設計培訓_<b class='flag-5'>第二部分</b>

    如何使用 Nios II 處理器進行你中意的設計之第二部分教程

    使用 Nios II 處理器進行設計”第二部分
    的頭像 發表于 06-11 14:36 ?5026次閱讀
    如何使用 Nios II 處理器進行你中意的設計之<b class='flag-5'>第二部分</b>教程

    AN-389: 使用Σ-Δ轉換器—第二部分[中文版]

    AN-389: 使用Σ-Δ轉換器—第二部分[中文版]
    發表于 03-19 06:38 ?0次下載
    AN-389: 使用Σ-Δ轉換器—<b class='flag-5'>第二部分</b>[中文版]

    有時你需要一點收獲第二部分

    有時你需要一點收獲第二部分
    發表于 04-19 11:32 ?9次下載
    有時你需要一點收獲<b class='flag-5'>第二部分</b>

    超聲波感應器會被用于何處?—— 第二部分

    超聲波感應器會被用于何處?—— 第二部分
    發表于 11-01 08:27 ?2次下載
    超聲波感應器會被用于何處?—— <b class='flag-5'>第二部分</b>

    如何實現更高的系統效率——第二部分:高速柵極驅動器

    如何實現更高的系統效率——第二部分:高速柵極驅動器
    發表于 11-02 08:15 ?2次下載
    如何實現更高的系統效率——<b class='flag-5'>第二部分</b>:高速柵極驅動器

    設計一臺物聯網模塊燈——第二部分

    設計一臺物聯網模塊燈——第二部分
    發表于 11-02 08:16 ?0次下載
    設計一臺物聯網模塊燈——<b class='flag-5'>第二部分</b>

    救世主Ga N來啦!第二部分:測量

    救世主Ga N來啦!第二部分:測量
    發表于 11-03 08:04 ?0次下載
    救世主Ga N來啦!<b class='flag-5'>第二部分</b>:測量

    生成任意量級的偏置電流網絡(第二部分

    生成任意量級的偏置電流網絡(第二部分
    發表于 11-03 08:04 ?0次下載
    生成任意量級的偏置電流網絡(<b class='flag-5'>第二部分</b>)

    參數接口重用VIP:第三部分

    在本系列的第一部分中,介紹了SystemVerilog接口的基本概念,并描述了這些接口參數給測試平臺代碼帶來的問題。在
    的頭像 發表于 05-29 10:32 ?738次閱讀
    主站蜘蛛池模板: 无码国产精品高潮久久9| 亚洲粉嫩美白在线| 亚洲精品国产字幕久久vr| 再插深点嗯好大好爽| 哒哒哒高清视频在线观看| 果冻传媒2021在线观看| 欧美日韩在线成人看片a| 午夜国产精品影院在线观看| 最近中文字幕免费高清MV视频 | 日产国产欧美韩国在线| 亚洲精品天堂自在久久77| a在线视频免费观看| 国语对白嫖老妇胖老太| 鸥美一级黄色片| 亚洲精品在线观看视频| 成人无码国产AV免费看| 久久精品国产欧美日韩99热| 涩涩电影网| 92午夜免费福利757| 国产在线精品亚洲观看不卡欧美| 免费在线a| 亚洲色图激情文学| 国产99精品视频| 末成年美女黄网站色大片连接| 亚洲 欧洲 国产 日产 综合| BL全肉多攻NP高H| 久久机热视频 这里只有精品首页| 色-情-伦-理一区二区三区| 最新色导航| 精品欧美小视频在线观看| 少妇被阴内射XXXB少妇BB| 99香蕉精品视频在线观看| 久久re这里视频只精品首页| 无码一区二区在线欧洲| www黄色com| 毛片999| 亚洲视频精品在线观看| 国产精品亚洲二线在线播放 | 一天不停的插BB十几次| 国产精品无码麻豆放荡AV| 日本一本道高清码v|