開源PSS解析器1

本章介紹另一個開源PSS解析工具zuspec:

? ? ? ? zuspec 提供了一組用于處理 actions relationship level 的工具 (ARL) 模型,主要是使用?Accellera 便攜式測試和刺激 (PSS)?語言描述的模型。ARL 模型用于為數字設計指定系統級測試。zuspec 具有非常模塊化的設計來支持快速探索這種建模方法的應用。

? ? ? ?zuspec 組件都是用 C++ 實現的,可通過 C++ API 和 Python API 獲得。這樣它們就可以通過 Python 集成,但要全速交互是通過 C++ 來實現(感覺有點像gem5的框架設計)。

應用

????????應用程序是大多數用戶體驗 zuspec 的方式。應用連接一個或多個 zuspec 組件,以及一些集成代碼,以滿足特定需求。zuspec主要由parser,solver和generateTest三部分組成; paser負責PSS語法解析,solver負責對約束語法和調度語法做求解,generateTest負責生成指定類型的測試激勵。

  • zuspec -- 支持代碼生成;
  • zuspec-SV -- 對 SystemVerilog 測試平臺環境的集成支持;
  • zuspec-be-sw?-- 對 SoC?測試平臺環境的集成支持;

前端(Parser)

????????前端進程和輸入描述(例如 PSS 語法),通常目標是填充 zuspec 的 ARL 數據模型,以便進一步處理和評估。

  • zuspec-parser -- 基于 ANTLR 的解析器和 Accellera PSS 的 AST(抽象語法樹);
  • fe-parser -- AST 到 ARL 數據模型轉換器;

核心數據模型和評估(Solver)

????????ARL 模型通常主要是聲明性描述。換句話說,他們在很大程度上基于約束。評估工具將數據模型處理執行它并進行優化。

  • arl-dm -- 捕獲 ARL 建模語義的核心數據模型;
  • arl-eval -- 核心評估器,支持對 ARL 模型進行解釋性評估;
  • vsc-dm -- 約束隨機描述的外部數據模型;
  • vsc-solvers -- 賦值器使用的約束求解器包;

后端(GenerateTest)

????????后端將 zuspec 評估集成到特定環境中或直接生成 ARL 模型的可執行表示。

  • be-sv -- SystemVerilog 集成和代碼生成器
  • be-sw -- 用于 C 和 C++ 輸出的代碼生成器

--------------------------------------------------------------------------------------------------------------------------------

測試用例

1. 獲取測試用例

git clone https://github.com/zuspec/zuspec-examples.git

2. 執行腳本(注意把python環境配置好)

cd zuspec-examples
./bootstrap.sh

3. 運行測試用例

$./packages/python/bin/ivpm activate
Note: Reading ivpm.yaml from project ./workspace/pss-tool/zuspec/zuspec-examples
Using dep-set default-dev-src for package zuspec-sv
Using dep-set default-dev for package dv-flow-mgr
Using dep-set default-dev for package dv-flow-libhdlsim
Using dep-set default-dev for package dv-flow-libpss

3.1 hello_world.pss測試用例代碼

import std_pkg::*;component pss_top {action test_a {rand int a, b, c;constraint a == 100;constraint (b + c) > a;exec body {message(LOW, "Hello World! a=%d b=%d c=%d \n", a, b, c);}};action Hello {activity {sequence {do test_a;}}}
}

3.2 執行zupsec 生成測試激勵

zuspec synth.sv.actor ./hello_world.pss -action pss_top::Hello

3.3 測試激勵

`include "zsp_sv_macros.svh"
package pss_types;import zsp_sv::*;typedef class pss_import_api;// TODO: define model-specific executor classtypedef executor_base executor_base_c;typedef executor_base executor_t;typedef class addr_region_base_s;typedef class pss_top;typedef class pss_top__aa;typedef class pss_top__bb;typedef class pss_top__Hello;class addr_region_base_s extends object;bit[63:0] size;function new();endfunctionvirtual function void dtor();endfunctionvirtual function void init(executor_base exec_b);endfunctionvirtual function void __assign__(addr_region_base_s rhs);size = rhs.size;endfunctionstatic function addr_region_base_s create_default();addr_region_base_s ret = new();return ret;endfunctionstatic function addr_region_base_s create_init(longint unsigned size);addr_region_base_s ret = new();ret.size = size;return ret;endfunctionfunction void do_pre_solve();pre_solve();endfunctionfunction void do_post_solve(executor_base exec_b);post_solve(exec_b);endfunctionendclassclass pss_top extends component_c;`zsp_typed_obj_util(pss_top)function new(string name, component_ctor_ctxt ctxt, component_c parent=null);super.new(name, ctxt, parent);if (ctxt != null) beginctxt.enter(this);endexecutor_m = new[ctxt.executor_m.size()](ctxt.executor_m);// Note: 'enter' handled by the component_c constructorctxt.leave(this);endfunctionfunction void do_init(executor_base exec_b);init_down(exec_b);init_up(exec_b);endfunctionvirtual function bit check();bit ret = 1;return ret;endfunctionendclasstypedef class pss_top;class pss_top__aa extends action_c;`zsp_typed_obj_util(pss_top__aa)`zsp_action_comp_type(pss_top)pss_top comp;rand bit signed[31:0] a;rand bit signed[31:0] b;rand bit signed[31:0] c;function new();endfunctionconstraint c_0x29d76240 {this.a == 32'h64;}constraint c_0x29d76290 {this.b + this.c > this.a;}function void do_pre_solve();pre_solve();endfunctionfunction void do_post_solve(executor_base exec_b);post_solve(exec_b);endfunctiontask body(executor_base exec_b);executor_t executor;pss_import_api api;$cast(executor, exec_b);$cast(api, exec_b.get_api());begin`zsp_message(exec_b, LOW, ("Hello World! a=%0d b=%0d c=%0d \n", this.a, this.b, this.c));endendtaskvirtual function void set_component(component_c comp);$cast(this.comp, comp);endfunctionvirtual function component_c get_component();return this.comp;endfunctionendclasstypedef class pss_top;class pss_top__bb extends action_c;`zsp_typed_obj_util(pss_top__bb)`zsp_action_comp_type(pss_top)pss_top comp;rand bit signed[31:0] a;rand bit signed[31:0] b;rand bit signed[31:0] c;function new();endfunctionconstraint c_0x29c5f4c0 {this.a == 32'h64;}constraint c_0x29d6af60 {this.b + this.c > this.a;}function void do_pre_solve();pre_solve();endfunctionfunction void do_post_solve(executor_base exec_b);post_solve(exec_b);endfunctiontask body(executor_base exec_b);executor_t executor;pss_import_api api;$cast(executor, exec_b);$cast(api, exec_b.get_api());begin`zsp_message(exec_b, LOW, ("Hello World! a=%0d b=%0d c=%0d \n", this.a, this.b, this.c));endendtaskvirtual function void set_component(component_c comp);$cast(this.comp, comp);endfunctionvirtual function component_c get_component();return this.comp;endfunctionendclasstypedef class pss_top;class pss_top__Hello extends action_c;`zsp_typed_obj_util(pss_top__Hello)`zsp_action_comp_type(pss_top)pss_top comp;function new();endfunctionfunction void do_pre_solve();pre_solve();endfunctionfunction void do_post_solve(executor_base exec_b);post_solve(exec_b);endfunctionvirtual function void set_component(component_c comp);$cast(this.comp, comp);endfunctionvirtual function component_c get_component();return this.comp;endfunctionendclassclass pss_import_api #(type BaseT=zsp_sv::empty_t) extends backend_api #(BaseT);endclassendpackage
`include "zsp_sv_macros.svh"
package pss_top__Entry_prv;import zsp_sv::*;import pss_types::*;typedef class pss_top__Entry_actor;typedef pss_top__Entry_actor actor_t;typedef class activity_0x29d457f0;typedef class activity_0x29cfa310;class activity_0x29d457f0 extends activity_c;function new(actor_c actor, component_c parent_comp);super.new(actor, parent_comp);endfunctionvirtual task run();// Traverse action pss_top::Hellobeginactivity_traverse_compound_c #(pss_top__Hello, activity_0x29cfa310) activity = new(actor, parent_comp);activity.run();activity.dtor();endendtaskendclassclass activity_0x29cfa310 extends activity_c;pss_top__Hello self;function new(actor_c actor, component_c parent_comp, pss_top__Hello self);super.new(actor, parent_comp);this.self = self;endfunctionvirtual task run();endtaskendclassclass pss_top__Entry_actor extends actor_c;pss_top comp_tree;pss_import_api api;executor_base_c default_executor;function new(pss_import_api api=null);component_ctor_ctxt ctxt;super.new("<actor>", null, null);ctxt = new(this, 0);this.api = api;this.default_executor = new("default_executor", this);comp_tree = new("pss_top", ctxt, this);endfunctionvirtual task run();activity_0x29d457f0 root_activity = new(this, comp_tree);comp_tree.init(this.default_executor);comp_tree.do_init(this.default_executor);if (comp_tree.check()) beginif (api == null) beginapi = new();endcomp_tree.start(this.default_executor);foreach(listeners[i]) beginlisteners[i].enter_actor(this);endroot_activity.run();foreach(listeners[i]) beginlisteners[i].leave_actor(this);endend else begin$display("Error: initialization check failed");endendtaskvirtual function pss_import_api get_api();return api;endfunctionvirtual function executor_base get_default_executor();return default_executor;endfunctionvirtual function backend_api get_backend();return api;endfunctionendclass
endpackage
package pss_top__Entry_pkg;import zsp_sv::*;import pss_top__Entry_prv::*;typedef pss_top__Entry_prv::pss_top__Entry_actor pss_top__Entry;
endpackage

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95838.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

26考研——內存管理_內存管理策略(3)

408答疑 文章目錄一、內存管理策略1、內存管理的基本原理和要求1.1、相關概念1.2、邏輯地址與物理地址1.3、程序的鏈接與裝入1.4、進程的內存映像1.5、內存保護1.6、內存共享1.7、內存分配與回收1.8、在存儲管理中涉及到兩個問題2、連續分配管理方式2.1、相關概念2.2、單一連續…

Python爬蟲實戰:研究Event Handling機制,構建在線教育平臺的課程數據采集和分析系統

1. 引言 1.1 研究背景與意義 在大數據時代,互聯網作為全球最大的信息載體,蘊含著海量有價值的數據。這些數據涵蓋了商業交易、用戶行為、社會趨勢等多個領域,對企業決策、學術研究和社會管理具有重要參考價值。如何高效、準確地獲取這些數據并進行深度分析,成為當前數據科…

docker 安裝 redis 并設置 volumes 并修改 修改密碼(四)

設置新密碼: 127.0.0.1:6379> CONFIG SET requirepass newpassword OK驗證新密碼: 127.0.0.1:6379> AUTH newpassword OK更新配置文件: 編輯主機的配置文件/data/redis/conf/redis.conf,將requirepass的值修改為新密碼: requirepass newpassword重啟容器以使配置…

NBA球星知識大挑戰:基于 PyQt5 的球星認識小游戲

NBA球星知識大挑戰&#xff1a;基于 PyQt5 的球星認識小游戲 代碼詳見&#xff1a;https://github.com/xiaozhou-alt/NBA_Players_Recognition 文章目錄 NBA球星知識大挑戰&#xff1a;基于 PyQt5 的球星認識小游戲一、項目介紹二、文件夾結構三、項目實現1. 自定義動畫按鈕&a…

電磁波成像(X射線、CT成像)原理簡介

電磁波成像&#xff08;X射線、CT成像&#xff09;原理簡介一、圖像形成的一般形式二、可見光成像2.1可見光2.2可見光成像三、其他電磁波成像3.1X射線成像3.2CT成像3.2.1CT成像原理3.2.2CT成像與X射線成像對比3.2.3CT生成三維描述3.3PET成像一、圖像形成的一般形式 大多數圖像…

k8s部署2:前置條件:docker部署

前兩天發布了k8s的前置發布條件,對于防火墻的處理,我看大家反響還不錯,所以作為先行者,我感覺自己多了不少動力,所以今天來說說k8s部署前置條件中docker部分的部署。在此先感謝一下那些點贊和添加收藏的朋友們,你們的支持是我永遠的動力!三克油喂給馬吃! 之前寫過docke…

某開源漫畫系統RCE代碼審計

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規&#xff0c;并取得目標系統的明確授權。 對于因不當使用本文信息而造…

Pandas DataFrame 指南

&#x1f4ca; Pandas DataFrame 常用操作代碼示例 下面用表格匯總了 DataFrame 的常用操作&#xff0c;方便你快速查閱和實踐。 操作類別代碼示例說明&#xff08;簡要&#xff09;數據讀取df pd.read_csv(data.csv)讀取 CSV 文件df pd.read_excel(data.xlsx, sheet_nameS…

React學習教程,從入門到精通, React 樣式語法知識點與案例詳解(13)

React 樣式語法知識點與案例詳解 作為React初學者&#xff0c;掌握樣式語法是構建美觀UI的關鍵。本文將詳細介紹React中所有主要的樣式方法&#xff0c;并提供詳細注釋的案例代碼。 一、React樣式語法知識點總覽 1. 行內樣式 (Inline Styles) 使用style屬性&#xff0c;值為Jav…

Proxychains 配置全解析:從入門到高級應用

引言 在數字時代&#xff0c;網絡隱私與安全至關重要。無論是繞過地理限制訪問內容&#xff0c;還是在滲透測試中隱藏蹤跡&#xff0c;代理工具都不可或缺。Proxychains&#xff08;或稱 Proxychains-NG&#xff09;作為一款經典的開源代理鏈工具&#xff0c;以其高效靈活的特性…

二叉樹的前中后序遍歷(迭代法)

目錄 題目鏈接&#xff1a; 題目&#xff1a; 解題思路&#xff1a; 代碼&#xff1a; 前序遍歷&#xff1a; 中序遍歷&#xff1a; 后序遍歷&#xff1a; 總結&#xff1a; 題目鏈接&#xff1a; 144. 二叉樹的前序遍歷 - 力扣&#xff08;LeetCode&#xff09; 94. …

redis的數據類型:string

文章目錄String類型介紹redis采用的字符集json類型介紹String類型的命令set key value [EX seconds] [NX|XX]incr keyincr對操作的key對應的value類型有限制嗎&#xff1f;incr key操作的返回值是什么&#xff1f;incr操作的key可以不存在嗎&#xff1f;多個客戶端同時針對同…

傳統神經網絡實現-----手寫數字識別(MNIST)項目

完整代碼&#xff1a;# import torch # print(torch.__version__)#1.X 1、驗證安裝的開發環境是否正確&#xff0c; MNIST包含70,000張手寫數字圖像: 60,000張用于訓練&#xff0c;10,000張用于測試。 圖像是灰度的&#xff0c;28x28像素的&#xff0c;并且居中的&#xff…

工業機器人標桿的數字化突圍,珞石機器人如何以CRM實現業務重塑

在智能制造浪潮下&#xff0c;工業機器人行業正迎來快速增長。作為國內領先的機器人制造商&#xff0c;珞石機器人面對業務規模的迅速擴張&#xff0c;意識到傳統的管理方式已無法滿足企業發展需求&#xff0c;急需通過數字化升級破解管理難題。因此珞石機器人選擇引入紛享銷客…

NVIDIA GPU的指令集詳細介紹

這是一個非常核心且深入的話題。GPU的指令集架構&#xff08;Instruction Set Architecture, ISA&#xff09;是理解GPU如何工作的關鍵&#xff0c;它直接體現了GPU為大規模并行計算而生的設計哲學。下面我將詳細、全面地介紹GPU的指令集。 第一部分&#xff1a;核心哲學 —— …

Day 17: 3D點云深度學習專項 - 理論深度與面試精通之路

Day 17: 3D點云深度學習專項 - 理論深度與面試精通之路 ?? 學習目標:深度理解3D點云核心理論,獲得該領域面試入場券 ? 預計用時:6小時 (理論深度4h + 面試準備2h) ?? 教學特色:理論優先 + 概念深度 + 面試導向 + 行業認知 ?? 今日學習大綱 1. 點云AI的理論基礎:幾何…

【經濟學】量化模型TradingAgents 工具集成層與數據(財報+ 基本信息指標+基本面分析)+ChromaDB 客戶端+財務情況記憶庫

文章目錄Toolkit 作用Toolkit 逐函數解析1. 獲取默認配置2. update_config3. config4. __init__5. get_reddit_news6. get_finnhub_news7. get_reddit_stock_info8. get_chinese_social_sentiment9. get_finnhub_company_insider_sentiment10. get_YFin_data11. get_YFin_data_…

Uni-App + Vue onLoad與onLaunch執行順序問題完整解決方案 – 3種實用方法詳解

導讀&#xff1a;在 Uni-app Vue 小程序應用開發中&#xff0c;你是否遇到過頁面加載時全局數據還未準備好的問題&#xff1f;本文將深入分析onLoad生命周期鉤子在onLaunch未完成時就執行的常見問題&#xff0c;并提供三種實用的解決方案。 &#x1f4cb; 問題描述 在 Vue 應…

25、SSH遠程部署到另一臺機器

25、SSH遠程部署到另一臺機器 因為不是每一臺服務器都有jenkins的&#xff0c;一般都是一臺jenkins&#xff0c;部署很多機器 1、安裝插件 Publish Over SSH2、配置另一臺機器 # 生成秘鑰 ssh-keygen -t dsa# 把公鑰復制到要訪問的機器 ssh-copy-id root目標機器的ip# 第一次要…

2025年金融專業人士職業認證發展路徑分析

在金融行業數字化轉型的背景下&#xff0c;專業認證作為提升個人能力的一種方式&#xff0c;受到越來越多從業者的關注。本文基于行業發展趨勢&#xff0c;分析6個金融相關領域的專業資格認證&#xff0c;為職業發展提供參考。一、CDA數據分析師認證含金量CDA數據分析師是數據領…