摘要:硬件世界与软件世界 module/endmodule,interface/endinterface可以被视为硬件世界 program/endprogram,class/endclass可以被视为软件世界。 always过程块是用来描述硬件时序电路和组合电路的正确打开方式,因此只可以在module或者
阅读全文
摘要:概述 流操作符(Streaming Operator)是 SystemVerilog 中专门用于数据打包(Pack)与解包(Unpack) 的利器。它能够将多个分散的数据信号组合成一个连续的比特流,或者从一个比特流中拆分出独立的数据信号。 在数字验证中,流操作符的应用场景非常广泛:总线事务打包、UV
阅读全文
摘要:在 SystemVerilog 中,case 语句用于执行多分支选择,其功能类似于 C 语言的 switch。除了传统的 case,SystemVerilog 还增加了 casez、casex 以及 unique、priority、inside 等增强特性,使分支判断更灵活、更安全。 1. 基本 c
阅读全文
摘要:在UVM/SystemVerilog中提取数字或拆分字符串,有几种主流且实用的方法:格式化输入 ($sscanf)、手动遍历字符、正则表达式 (uvm_re_match, str.match) 以及第三方库 (svlib)。通常,最简单的是用 $sscanf,而更复杂的模式则适合用正则表达式。 🎯
阅读全文
摘要:wdata ={>>{ch_ctl[ch_id]}}; 这段代码使用了 SystemVerilog 的 流操作符(streaming operator),其作用是 将 ch_ctl[ch_id] 打包成一个位流并赋值给 wdata。 详细解释 语法形式:{>>{expr}} 是流操作符的一种。其中:
阅读全文
摘要:在uvm里面的使用: 功能覆盖率的时候使用: covergroup cg_apb_command @(posedge clk iff rstn); endgroup monitor的时候使用: task apb_master_monitor::collect_transfer(); // Advan
阅读全文
摘要:1、`timescale是个编译参数,编译时候起作用。 2、在没有定义`timescale的module中,其timescale使用跟它最近的一个且编译顺序上排在前的module中的timescale。 3、如果编译顺序前的module也没有timescale,则使用编译命令输入的default t
阅读全文
摘要:typedef logic [15:0] r_t;//变量类型; r_t r;//声明变量; integer i = 1; string b = ""; string a = {"Hi", b}; r = r_t'(a); // OK b = string'(r); // OK 注意不需要对等号左边
阅读全文
摘要:在UVM中,使用uvm_field_automation机制注册二维数组需要特殊处理,因为UVM没有直接支持二维数组的宏。以下是三种实现方法,从推荐程度排序: 方法1:使用动态数组的动态数组 + 自定义处理(推荐) class my_item extends uvm_sequence_item; /
阅读全文
摘要:在SystemVerilog中,将1位的bit类型值1扩展为8位的byte类型(所有位均为1,即8'b11111111),可以通过以下两种方法实现: 1. 使用位复制操作符(推荐) bit a = 1'b1; // 1位变量,值为1 byte b; // 8位有符号整数类型 assign b = {
阅读全文
摘要:句柄的传递 句柄可以用来创建多个对象,也可以前后指向不同对象 Transaction t1,t2; // 声明句柄 t1 = new(); // 创建对象并将其指针赋予t1 t2 = new(); // 创建对象并将其指针赋予t2 t1 = t2; // 将t2的值赋予t1,t1和t2指向同一对象,
阅读全文
摘要:做IC 验证进行transaction比对时,发现曾经验证通过的module总是发生mismatch的情况,这是不应该发生的情况,因为这个module曾经已经验证通过并且RTL已经稳定,bench也很稳定,但是出现了mismatch的情况。最后经过debug发现两种不同写法的代码会导致不同的结果:
阅读全文
摘要:使用SystemVerilog搭建环境的时候,经常会遇到需要对一个对象进行复制,以防止对象的方法修改原始对象的值。对于初学者经常会使用new函数来实现class的内建的复制功能,但是,当要复制的对象中含有其他对象(object)时,使用内建的复制功能将会得到不期望的结果。本文将示例说明shallow
阅读全文
摘要:当某个信号出现多于一个驱动源的时候,或者某个信号是双向(inout)的时候,都需要使用wire来完成线网连接。具体用法就是声明某个信号为wire sigal_a;或者wire logic signal_a;就可以了。 注意直接声明为logic signal_a;是不行的,会报类似如下的错误:xmel
阅读全文
摘要:Verilog/SystemVerilog ``` //条件语句 if () else if() else //条件编译 `ifdef macro `ifndef macro `elsif macro `else `endif ``` bash shell ``` //条件语句 if command
阅读全文
摘要:``` 在搭建验证环境时,经常需要在环境中插入很多info用于输出一定的log信息用于进行debug,在插入这些info方法的时候,经常需要同时输出该方法执行的具体时间,用于方便定位问题,为此在Verilog和SystemVerilog中提供了一堆关于time的方法,如果对于这些方法使用的不是很恰当
阅读全文
摘要:这个系统函数在[IEEE]SystemVerilog.std.1800_2017里你是搜索不到的,但是你在SystemVerilog的环境中是可以使用的。 你可以使用$stack()这个系统函数来查看报错的文件层次,类似于python的trackback,可以帮助你定位异常问题,从而协助你进行deb
阅读全文
摘要:``` 本文主要给大家介绍SV宏,谈到SV宏大家应该不会感到陌生,因为大家在做前端设计或验证的时候会用到`define定义宏,进行条件编译,或者使用宏来定义参数等,做前端验证的工程师会使用`define来定义一些信号路径等。这些SV宏的用法都是比较常规的用法,很少有验证工程师使用SV宏来处理一些其他
阅读全文
摘要: 示例中,在for循环中使用了fork...join_none结构调用$write显示每次循环执行过程中循环变量的
阅读全文
摘要:我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例: 1、如何约束动态数组的最后一个元素为特定值。(事先不知道数组的大小) ``` rand int some_dynamic_array[]; constraint last_elem_c { some
阅读全文