- 博客(114)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 multi-language verification (四)SystemC Verification、SystemC-SystemVeilog混仿
SystemC是基于C++语言(最新版已支持C17特性)的扩展库,是为了解决跨越软件和硬件的一种系统级设计,高级综合,建模,验证的语言,可用于软件开发、软件性能分析、架构性能分析、硬件验证多种场景。SystemC最早源于非盈利组织🔗OSCI),后来归属于🔗ASI) SystemC,并成为众多IEEE标准之一。本篇侧重SystemC在Verification方面的介绍,ESL建模感兴趣的可查看:🔗ESL发展及其在项目中的应用,🔗漫谈芯片建模。
2024-05-10 16:47:52
1911
1
原创 Formal Verification (一) 形式验证的分类、发展、适用场景
定义Formal Verification:利用数学分析的方法,通过算法引擎建立模型,对待测设计的状态空间进行遍历的验证。分类相比于动态仿真Simulation Veficiation,形式验证属于Static Verification,不需要手动灌入激励;通过数学分析的方式,对待测设计进行检查;形式验证分为两大分支:Equivalence Checking 等价检查 和 Property Checking 属性检查形式验证初次被EDA工具采用,可以追溯到90年代,被应用于RTL code和ga
2022-02-25 22:27:26
25217
原创 VC Spyglass CDC(一)CDC与亚稳态、亚稳态电路的分类
CDC与亚稳态Clock Domain Crossing (CDC): 跨时钟域设计中,信号adat从aclk domain传播到bclk domain;aclk与bclk之间的频率,相位没有固定关系,为asynchronous异步关系的时钟。Metastability: 当adat在bclk采样点附近变化时,不满足后级flip-flop的setup/hold time,D端无法完成正确的锁存,Q端的输出在较长一段时间内处于不确定的振荡值,出现亚稳态的现象。亚稳态传播给后级组合逻辑时,其不确定的X态会
2021-10-05 20:39:48
7749
12
原创 UVM设计模式 ( 二 ) 参数化类、静态变量/方法/类、单例模式、UVM_ROOT、工厂模式、UVM_FACTORY
软件中的设计模式可归纳为三类:创建型,结构型,行为型。本节介绍创建型设计模式在UVM中的应用。在开始创建型设计模式介绍之前,回顾下Systemverilog中的Parameterized classes 和 Static method 的相关语法。参数化的类SV中的参数化的类,类似于Verilog中参数化的模块,例化时指定位宽等的值,在SV中一般用于为类增加数据类型的参数。如下示例,在声明S_bit句柄时,传入的type类型为bit [1:10],W没有指定默认为5,如果type T没有指定
2020-12-12 17:48:29
13561
19
转载 RVV第17讲之RVV 标准向量扩展
完整的V扩展使用单个V字母来表示,V扩展还可以拆分为子扩展,子扩展以zve前缀命名,用户可以根据实际嵌入式芯片的实际需要来选择子扩展,以此减少芯片面积。所有Zve*扩展都支持向量配置指令(见第6讲向量设置指令vsetvli/vsetivli/vsetvl)扩展都支持所有向量加载和存储指令(见第10讲向量加载存储指令),但Zve64。扩展都支持所有向量定点算术指令(见第12讲定点算术指令),但Zve64。扩展都支持所有向量整数指令(见第11讲整数算术指令),但Zve64。
2025-06-18 16:24:19
358
转载 RVV第16 讲之RVV 排列指令
向量压缩指令允许从源向量寄存器中挑选出由向量掩码寄存器标记的元素打包到目标向量寄存器开始处,简单来说:compress指令用于将数据中某些数据“剔除”,实现数据压缩。下图可以清晰的看到这条指令的作用,vcompress指令需要找出mask数据中1的位置(index),再根据位置实现数据重排列。向量-标量Move指令,在标量x寄存器与向量寄存器的元素0之间传输单个值(这条指令会忽略LMUL参数)浮点-标量move指令,在标量f寄存器与向量寄存器的元素0之间传输单个值(这条指令会忽略LMUL参数)
2025-06-18 16:23:55
325
转载 RVV第15 讲之RVV 掩码(Mask)指令
比如数组 a0, a1, a2…a31 其中有两个元素a8 和 a10 不参与运算,那么我们可以使用一个mask值来指使哪些元素参与运算,1bit来指定一个元素masked或者非masked,bit=0表示非masked,bit=1表示masked。向量MASK-寄存器逻辑指令用来操作掩码寄存器,向量MASK寄存器的的每个元素都是一个bit,所以这些指令都是在单个向量寄存器上操作的,与。vcpop.m 指令用来统计掩码寄存器(即V0寄存器)中处于活跃状态数据元素的数量,即掩码中bit=1的数量。
2025-06-17 15:18:42
348
转载 RVV第14 讲之RVV Reduction指令
而vfredusum是乱序的,性能比vfredosum好,但其结果可能与标量运算结果有些小的差别,这是因为浮点运算的计算顺序可能会影响结果。向量reduction操作接收一个向量寄存器组中的元素和一个向量寄存器第0个元素作为入参,结果存放到目标向量寄存器的第0个元素中。向量reduction操作读取并写入向量寄存器的第0个元素,而不是直接使用标量寄存器,目的是使VPU与标量CPU解耦。vredand 所有元素按位相与,vredor 所有元素按位或, vredxor所有元素按位异或,这几条指令不再举例。
2025-06-17 15:16:53
243
转载 RVV第13 讲之RVV浮点算术指令
向量浮点运算会共用标量浮点运算的一些浮点状态寄存器。如浮点异常标志寄存器。这一章讲述RVV 向量浮点算术命令。17 单宽度浮点&整数类型转换指令。11 向量浮点MIN/MAX指令。18 扩宽浮点/整数类型转换指令。19 缩减浮点/整数类型转换指令。9 向量浮点倒数平方根估计指令。2 单宽度向量浮点加减法指令。6 单宽度向量浮点乘加指令。提供扩宽的浮点乘加等指令。10 向量浮点倒数估计指令。12 向量浮点符号注入指令。提供向量浮点加减法指令。3 扩宽向量浮点加减指令。7 扩宽向量浮点乘加指令。
2025-06-17 15:16:01
216
转载 RVV第12 讲之RVV定点算术指令
当整数位m = 0时,除符号位以外都是小数位,表示区间为[-1, 1),可简写为Qn。如Q15表示16bit,其中1bit为符号位,其余15bit为小数位。Q数据类型完整格式为: Qm.n ,共需1(符号位)+ m (整数位) + n (小数位)bit位来表示数据。RVV中提供一些Q类型(Q7, Q15, Q31, Q63)运算的指令,恰当的运用这些指令可以提高运算效率。同饱和加一样,带饱和的减法可使用vssub,一条指令实现如下C版本的效果。带饱和的乘法V扩展指令:vsmul。1 单宽度向量饱和加减。
2025-06-17 15:15:24
207
转载 RVV第11 讲之RVV整数算术指令
操作数右移,可以将一个较宽的数据变为一个较短的数(会截断高位)。如32bit的数右移16位,所得的结果为16bit,未来的扩展可能会增加(4*SEW) >> SEW的操作。包括:1 逻辑左移(sll),逻辑右移(srl),算术右移(sra),算术左移与逻辑左移一样的操作。比如:两个int16 类型数据相加,如果结果也是int16类型,可能发生溢出,所以提供扩宽的加减法(包括有符号数与无符号数)。显式的向量扩展指令,无符号扩展(补充0),有符号扩展(补符号位),包括2, 4, 8倍的扩宽。
2025-06-17 15:14:39
266
转载 RVV第10讲之RVV向量加载存储指令
按索引的load 可以装载指定index的元素(并不要求是数据连续的或者有固定间隔,而是用index向量来描述装载元素相对起始点的位置), 按索引的Store 可以将向量寄存器中的元素存储到index 指定的位置。时,只会取元素0,上述用例结果为 pDes[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};时,每隔一个e32取一个元素,pDes[16] = {1, 3, 5, 7, 9, 11, 13, 15…} 可以实现分奇偶取数的目的。
2025-06-17 15:12:46
485
转载 RVV第9讲之搭建RVV开发环境
RVV intrinsic API 可查询 rvv-intrinsic-doc/auto-generated/intrinsic_funcs.adoc。本文档列出RVV intrinsic function的用例,仓库中也提供相同的用例,我们可以拉取下来,然后进行测试。qemu没有预编译好的版本,需要自己手动编译,为了方便,这里我们选择qemu-user模式。接下来,单步调试这个RVV函数,并查看RVV的寄存器,可见v24 寄存器的内容符合预期。4 rvv-intrinsic-doc 仓库的使用。
2025-06-17 15:12:08
305
转载 RVV第8讲之RVV intrinsics spec(翻译)
如果直接使用手撸汇编,我们需要时刻小心RVV寄存器堆的分配以及RVV参数的配置,这样上手非常困难,幸好编译器提供RVV intrinsics 接口,我们可以像C语言编程一样很方便的调用这些API,将寄存器分配、指令调度等复杂工作交给编译器,极大的降低了上手难度。RISC-V的一个特点是模块化,其RVV也包含一些子扩展,它们(除开必要的依赖)也可以单独的打开关闭,这意味着硬件可以根据需求选择不同的子扩展,进而减少硬件面积开销。用户应该意识到,混合使用intrinsics和内联汇编将导致额外的保存和恢复。
2025-06-17 15:11:29
353
转载 RVV第7讲之intrinsic 编程
如果你已经了解了基础的RVV指令,下一步就是尝试使用这些指令,要么手撸汇编,要么使用RVV intrinsics函数,RVV intrinsics函数是一种低级函数,只是将汇编指令进行封装,基本上可与RVV 指令一对一映射,这样方便调用,使得RVV intrinsics 编程无需汇编专业知识即可使用。早期的intrinsics 函数被编译成一条vsetvl指令和一条RVV指令,后来,编译器优化了vsetvl指令,只在必要的时候才生成vsetvl指令。
2025-06-17 15:08:40
408
转载 RVV第6讲之RVV 向量设置指令
处理大量元素的一种常见方法是“条状挖掘”,即循环的每次迭代都处理一些元素,迭代继续,直到所有元素都被处理完毕。当rs1 为x0,rd 为非x0时,AVL = ~0,即AVL设置为最大整数值,这样将vlmax写入。当rs1 非x0时,AVL = x[rs1],计算得到vl值,写入。)作为输入,通过vsetvl指令计算,然后将计算得到的结果写入。入参AVL,即指令中的rs1或uimm,表示要处理的元素总数;寄存器的,而是将AVL参数传递给vsetvl指令来设置正确的。寄存器,新的vl值也被写入rd寄存器中。
2025-06-17 15:08:01
276
转载 RVV第5讲之RVV 向量指令格式
举例:VLEN = 128 bits,当元素类型为int32_t时,每个RVV寄存器可以装4个元素(VLEN / SEW), LMUL 可以取{1/2,1, 2, 4, 8}(为什么LMUL不能取1/8 与 1/4?可以取不同值{1/8, 1/4, 1/2, 1, 2, 4, 8} 表明,向量操作数可能占据一个或多个向量寄存器,但编码中使用编号小的寄存器来指定这个向量寄存器组。下面的指令是在标量x寄存器与向量寄存器的元素0之间传输单个值,属于标量运算,标量操作不受。(有效寄存器组乘系数)。
2025-06-17 15:06:49
467
转载 RVV第4讲之RVV 数据在向量寄存器的布局
对于 VLMAX = LMUL*VLEN/SEW , 当LMUL=8以及SEW=8 时,VLMAX取最大值,值为VLEN,也即向量寄存器组最多存储VLEN个元素,一个掩码寄存器(VLEN bits)正好能够对应。向量寄存器中剩余部分(下图画横线部分)被视为尾部(Tail部分)的一部分,尾部元素必须服从vta设置。=128bits时四种不同的填充元素宽度(8b、16b、32b、64b)以及不同的寄存器组乘系数(= 1,意味着只使用单个向量寄存器,用来将数据摆放到这个寄存器里。参数下向量寄存器中元素的排布。
2025-06-17 15:06:09
277
转载 RVV第3讲之RVV编程模型
举例:VLEN = 128 bits,当元素类型为int32_t时,每个RVV寄存器可以装4个元素(VLEN / SEW), LMUL 可以取{1/2,1,2, 4, 8}(为什么LMUL不能取1/8 与 1/4?下面以一个示例详细的讲述一下向量寄存器的的Prestart部分,Body部分,Tail 部分,Active 元素, Inactive元素,不同部分使用不同颜色块区分。misa.V是多少位?RVV 有32个vector寄存器,编号v0-v31,每个寄存器的宽度是固定的,宽度为VLEN bits。
2025-06-17 15:05:21
302
转载 RVV第2讲之RVV常见名词解释
对于输出C向量,数据类型为Int64,VLEN=128bits,那么一个向量寄存器可以放{c0~c1} 共2个元素,很明显2个寄存器存放不了8个int64 元素,所以LMUL也要扩宽,也即。,有些加宽指令中,元素的数量是一样的,所以对于目的操作数,寄存器组乘系数需加宽一倍。与LMUL类似,表示有效寄存器组乘系数,对于加宽指令,目的寄存器组乘系数会加宽一倍。可取值1/8,1/4,1/2, 1,2, 4,8 这并不意味着在什么情况下。表示寄存器组乘系数,表示一个寄存器组由多少个向量寄存器组成,
2025-06-17 15:04:31
375
转载 RVV第1讲之RVV简介
即Arm Advanced SIMD,首次在ARM v7-A微架构中引入,NEON的工作原理是使用一组16个128位寄存器或当做32个64位寄存器(Arm v8-A 中是32个128位寄存器),将这些寄存器视为包含固定数量的相同类型数据元素的向量,可以使用一个指令同时对所有这些数据元素执行相同的操作,从而实现数据并行性。对于ARM Neno指令(Intel AVX类似),处理的是定长的数据,如果数据的数量不是向量大小的整数倍,就会出现剩余元素的问题,这些剩余元素需要特别处理,参考ARM官方的。
2025-06-17 15:02:42
664
原创 PCIE集成验证(五)MSI/MSI-X中断
PCI 总线最早采用的中断机制是 INTx,这是基于边带信号的。后续的 PCI/PCI-X版本,为了消除边带信号,降低系统的硬件设计复杂度,逐渐采用了 MSI(MSI/MSI-X 与 PCIe总线中的消息(Message)的概念完全不同!MSI最大支持32个中断向量,MSI-X在 3.0 版本引入,对 MSI 做出了一些升级和改进,最大支持2048个中断向量。MSI是信号控制,有用户封装一个misc模块,这里是msi_agent代替。MSI-X,芯片内部的ram实现,MSI-X是写寄存器配置。
2024-09-21 21:35:36
3192
原创 PCIE集成验证(四)inbound/outbound访问,寄存器访问
PCIE对BAR空间的访问,可通过MEM类型的TLP实现;分为读包和写包,根据访问地址的大小,分为3DW(32bit地址访问)和4DW(64bit地址访问)包;DUT发送给PCIE VIP的包,放在target_app中,根据类型分为IO/Cfg/MEM target;发送MWr32的包,访问地址’h1000020,写入64个DW;在第一节RTL配置中,对于BAR2/BAR4的访问,走aix通道;axi_slave端口发送请求,HOST返回Cpld包;CplD为MEM_RD TLP的结果返回包,附带数据;
2024-09-20 22:15:13
2904
原创 PCIE集成验证(三)链路训练,枚举,BAR配置
PCIE初始化流程包括PHY加载fireware程序,链路训练,设备枚举,能力寄存器配置,BAR空间分配等。
2024-09-19 20:57:48
4580
原创 PCIE集成验证(二) PCIE VIP使用
VIP结构,模拟PCIE协议实现,也是分层结构;采用layering sequence的方式,像其他分层协议如USB,USF等,也是相同的结构;service_sequencer处理service transactions,控制driver的行为;类似,但requester_app只能发送memory访问的包,适合构造大量memory访问的场景。用例集成VIP,VIP模拟RC,DUT为EP类型,serdes接口连接。模拟PCIe协议栈;支持多种接口,MAC层的PIPE,PCS并行接口,PMA串行接口;
2024-09-15 15:04:47
6986
6
原创 PCIE集成验证 (一)PCIE RTL生成,开箱用例,DUT结构
本系列使用S家IIP()和VIP()作为学习资源,不具备工程实践意义,仅用于学习VIP的集成验证;路径下有iip目录和vip目录,分别存放PCIE IP源文件和PCIE_SVT源文件;
2024-08-28 17:07:40
2828
5
原创 multi-language verification (五)UVM-SV通过DPI或者SC-UVM_ML库调用Matlab
本篇将演示一个UVM-SV通过C/CPP作为胶合语言,调用Matlab的示例;并介绍两种方式,一种DPI封装为函数的方式,一种使用UVM-ML OA库,基于TLM通信的方式。
2024-05-15 11:41:20
1779
1
原创 multi-language verification (六)UVM-SV通过DPI或者SC-UVMC库调用Python
上一篇介绍了调用Matlab,本篇介绍SV如何调用Python,也是举例两种方式,一种DPI方式,一种SC TLM方式(使用另一个库:UVMC)。Python自带丰富的库资源,使用C/CPP作为胶合语言,EDA仿真时也可以同步调用Python,实现runtime阶段。和上一篇调用Matlab类似,通过胶合语言C/CPP,找到合适的API,就可以实现SV和其他语言的混合仿真。一般步骤为初始化Py,获取文件路径,导入模块,传入参数,调用获取结果,内存回收,结束Py;也可以实现Python的调用,借助C的。
2024-05-15 11:38:52
1586
原创 multi-language verification (三)SV DPI call C/C++
中了解,相比TF (Task / Function),ACC (Access)和VPI (Verification Procedural Interface)这类编程接口,DPI更适合C程序的直接调用,不涉及内存的来回拷贝,效率更高,部署也更方便;DPI中C和SV之间的数据传输,本质是仿真器在C/SV两侧调度切换时,利用指针来操作同一类数据结构的内存空间,指针在被使用前,只需要在C或SV中的一侧被初始化分配内存空间即可。SV中最小的数据格式为2值1位宽的bit,C语言最小的为8位宽的char字节;
2024-05-10 16:26:23
1830
原创 multi-language verification (二)C/C++基础梳理
在开始后续篇幅之前,梳理一下C/C++的语法知识点;对于嵌入式开发或者软件开发的人来说,C/C++并不陌生。但对于SV”选手“来说,这是前期最大的”障碍“。本篇侧重梳理,授之以渔的方式,不会详细解读某一个点。
2024-05-09 10:04:56
1090
原创 multi-language verification (一)DVT-Eclipse配置SystemC开发环境
使用一款IDE(集成开发环境)替代传统的gvim作为编辑工具,大大提高开发效率;本系列选择DVT(Design andVTool)作为C/C++的开发工具,🔗DVT是AMIQ开发的一款专门服务于IC Design Verification的IDE,基于Eclipse平台开发,支持SystemVerilog,UVM的相关特性,提供代码调用跳转,on-the-fly的语法检查,快速的代码检索,单步调试等丰富功能;
2024-05-07 22:13:49
1301
原创 VCS ICO - Intelligent Coverage Optimization
会在用户约束的基础上,做一些自动“修正”,以此来优化随机激励,提高随机多样性,加速覆盖率收敛,缩短 turn-around time。是vcs提供的用于优化覆盖率的feature;等约束了变量的随机概率,而。
2023-07-30 22:26:40
2272
原创 C case和UVM TB的交互,tube_print, event_sync
C代码调用printf时,打印信息显示在哪个IO上,由pringf调用的底层代码决定;软件C中的printf默认在terminal上打印;对于嵌入式C, 运行在开发板上的code,可以借助target自己的显示IO,如LCD屏,将打印信息直接显示在LCD屏上;如果target没有显示IO,也可以retarget到host端的terminal上;simulation仿真时,运行的C代码需要借助主机host的IO,将打印信息显示在simulation terminal上;
2022-12-25 21:28:39
3039
转载 systemverilog : constraint slove... before 详解
总的来看,使用->或者if-else时,参数的概率分布会变得复杂且不易理解,尤其涉及到多条件蕴含时,某些参数的概率分布很难做出预期,因此更加需要后续的功能覆盖率加以分析,找出不合理的约束。
2022-09-16 21:14:57
2306
1
原创 Formal Verification (三) abstraction strategy、reduce complexity for convergence
“空间爆炸”大大增加了formal工具处理的复杂度,在有限的资源内,难以达到收敛。所以采用一些abstraction的手段,是十分有效且必要的。正确的abstraction处理,使用abstrct model代替real model,不会影响目标结果,同时加速证明。abstraction不等同于简单的reduction,如下示例:RTL中,当timer大于1000时,触发timeout。需要运行1000个cycle才会触发。Reduction将阈值设置为5,缩减到5个cycle触发。因为原RTL中还
2022-07-10 17:32:38
5332
7
原创 Formal Verification (五) coverage、sign-off flow
formal和simulation一样,也是基于coverage-driven的验证方式;分为branch,statement,expression,toggle;这部分概念和simulation类似,如下图:用于衡量cover item(CI) (CI可以简单理解为RTL code)在验证过程中是否被覆盖到;:工具追踪并覆盖了该CI:在有限的时间内,未追踪覆盖该CI:在给定的约束条件下,无法覆盖该CI(可能存在over-constraint的问题:在任何条件下,都无法覆盖该CI。
2022-04-24 17:10:48
6077
3
原创 Formal Verification (四) bounded proof、bug hunting、advanced topic
形式验证本质上是一种`model checking`;不同类型的模型检查,调用不同的算法引擎;对于特定的属性求解,需要调用合适的engine;`symbolic model checking`基于`BDD`(binary decision diagram);`BMC (bounded model checking)`基于`SAT`(satisfiability)
2022-04-24 16:31:56
3145
3
原创 Formal Verification (二) FPV、APPs
通过上一篇对Formal Verification有了基本的认识;本篇将通过一个简单的例子,感受一下Formal的“魅力”;Formal Tool目前主流的有Synopsys的VC Formal,Cadence的Jaspergold,Mentor的Questa FV以及🔗OneSpin的Verify;本篇使用VC Formal演示,其他工具思路类似。Assertion具体assertion的语法不再介绍,可以参考《SystemVerilog Assertions and Functional Cover
2022-02-26 14:49:37
15887
10
原创 FSM model in VC USB VIP
Introduction在????layering sequence in VC USB VIP中介绍了USB VIP的结构,其中svt_usb_link分为USB2.0和USB3.x;usb_ss_link包含了Super-Speed LTSSM;usb_20_link包含了2.0 Device-A State Machine(模拟Downstream Facing Ports FSM)、2.0 Device-B State Machine(模拟Upstream Facing Port FSM);USB
2021-12-14 20:37:50
3660
9
python爬虫使用requests下载zip,但是报 404 Client Error
2021-04-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅