开源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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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数据分析师是数据领…