自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 资源 (1)
  • 收藏
  • 关注

转载 CHI 协议介绍

一致性总线接口(CHI)是AXI一致性扩展(ACE)协议的演进。它是Arm的AMBA总线的一部分。AMBA是一种免费可用、全球采用的开放标准,用于SoC中功能模块的连接和管理。它有助于一次性正确开发具有大量控制器和外设的多处理器设计。CHI适用于需要一致性的各种应用,包括移动、网络、汽车和数据中心。AMBA CHI旨在维护组件数量和流量不断增长的系统中的性能。CHI旨在实现可扩展性,用于构建小型、中型或大型系统。

2024-04-25 16:59:58 31

原创 [VIM] MiniBufExplorer插件

我们在开发环境或者debug环境的时候,经常需要在不同的路径下的不同file中切换,一种可行的方法是开多个vim窗口,并排放着,需要开哪个的时候点哪个,但是打开的file很多的时候就不太方便了,这里推荐一个vim 插件:MiniBufExplorer。下载安装方法比较简单,有很多教程,我就不介绍了,使用方法也有人提到,但是不够清晰明了,这里梳理一下,以备所需。

2024-04-18 15:50:10 294

转载 SVA基本语法

断言作为声明被执行的验证函数的断言语句出现。

2024-03-18 10:50:20 131

原创 [Verdi] fsdbreport的妙用

到处到文本中后,我们就可以利用gvim相关命令简单处理成方便对比的形式,比如文本排序sort等。1.数据只在跳变的时候写出。

2024-03-14 16:32:00 349

原创 [UVM] 寄存器模型相关method详解

【代码】[UVM] 寄存器模型相关method详解。

2024-03-06 13:57:04 679

原创 gvim自动对齐插件--Align

我们在看别人的代码的时候,一定看到过有人的代码看起来非常的美观,缩进对齐这些都非常的工整,这里推荐一款自动对齐的插件,经过实测,简单方便又好用。

2024-02-29 15:35:19 412

原创 利用gvim宏快速生成连续带数字下标的信号

现在我们需要instance 4份dut(dut_0-3),那么端口上对接的信号就会有16个req_x,req_0-3对应dut0 .req_4-7对应dut_1,以此类推,在手动连完dut_0之后,怎么快捷完成其他几个的连接呢,这里介绍宏录制的方法:(以dut_1连接为例)c.光标定位到my_req_0中的数字0上面,依次按下4和Ctrl+a(功能是执行+4,0变成4)d.移动光标到下一行的my_req_1中的数组1上面,然后按下q,结束宏录制。b.按下x,x是宏的名字,可以是其他字母。

2024-02-22 18:06:44 164

转载 Linux 好用的比较文件/目录的工具---Meld

Meld 是我处理代码和数据文件的基本工具之一。它是一个图形化的 diff 工具,因此,如果你曾经使用过diff命令并难以理解输出,那么可以为你提供帮助。Meld 是跨平台的,它有一个使用包管理器的。尽管它在 macOS 上不受官方支持,但有有关,请参见 Meld 的主页。

2024-02-05 15:18:12 200 1

转载 Cache 系列文章8:伪共享

我们知道kernel地址空间是所有进程共享的,所以kernel空间的全局变量,任何进程都可以访问。假设有2个全局变量global_A和global_B(类型是long),它们在内存上紧挨在一起,如下图所示,假设cache line size是64Bytes。所以global_A和global_B如果同时load到Cache中,一定是落在同一行cache line。就像下面这样。现在我们知道多核Cache一致性由MESI协议保证。

2024-01-31 17:00:00 48

转载 Cache 系列文章7:atomic实现原理

借助多核Cache一致性协议可以很方便实现原子操作。当然远不止上面举例说的atomic_inc还有很多其他类似的原子操作,例如原子比较交换等。

2024-01-31 16:14:35 53

转载 Cache 系列文章6:多核Cache一致性

多核Cache一致性由硬件保证,对软件来说是透明的。因此我们不用再考虑多核Cache一致性问题。另外,现在CPU硬件采用的一致性协议一般是MESI的变种。例如ARM64架构采用的MOESI Protocol。多一种Owned状态。多出来的状态也是为了更好的优化性能。

2024-01-31 16:01:30 71

转载 Cache 系列文章5:iCache和dCache一致性

CPU和主存之间也存在多级高速缓存,一般分为3级,分别是L1, L2和L3。另外,我们的代码都是由2部分组成:指令和数据。L1 Cache比较特殊,每个CPU会有2个L1 Cache。分别为指令高速缓存(Instruction Cache,简称iCache)和数据高速缓存(Data Cache,简称dCache)。L2和L3一般不区分指令和数据,可以同时缓存指令和数据。下图举例一个只有L1 Cache的系统。我们可以看到每个CPU都有自己私有的L1 iCache和L1 dCache。

2024-01-30 17:28:26 100

转载 Cache 系列文章4:Cache和DMA一致性

DMA应该多多少少知道点吧。DMA(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到内存的技术。这个过程中可以把CPU解放出来,可以很好的提升系统性能。那么DMA和Cache有什么关系呢?这也需要我们关注?

2024-01-30 17:09:32 48

转载 Cache 系列文章3:TLB原理

TLB是translation lookaside buffer的简称。首先,我们知道MMU的作用是把虚拟地址转换成物理地址。虚拟地址和物理地址的映射关系存储在页表中,而现在页表又是分级的。64位系统一般都是3~5级。常见的配置是4级页表,就以4级页表为例说明。分别是PGD、PUD、PMD、PTE四级页表。在硬件上会有一个叫做页表基地址寄存器,它存储PGD页表的首地址。MMU就是根据页表基地址寄存器从PGD页表一路查到PTE,最终找到物理地址(PTE页表中存储物理地址)。

2024-01-30 16:09:30 29

转载 Cache 系列文章2:Cache的组织方式

VIVT Cache问题太多,软件维护成本过高,是最难管理的高速缓存。所以现在基本只存在历史的文章中。现在我们基本看不到硬件还在使用这种方式的cache。现在使用的方式是PIPT或者VIPT。如果多路组相连高速缓存的一路的大小小于等于4KB,一般硬件采用VIPT方式,因为这样相当于PIPT,岂不美哉。当然,如果一路大小大于4KB,一般采用PIPT方式,也不排除VIPT方式,这就需要操作系统多操点心了。

2024-01-30 15:51:33 41

转载 Cache 系列文章1:Cache的基本原理

对于没有接触过底层技术的朋友来说,或许从未听说过cache。毕竟cache的存在对程序员来说是透明的。在接触cache之前,先为你准备段code分析。如果你曾经学习过C/C++语言,这段code自然不会陌生。如此简单的将arr数组所有元素置1。你有没有想过这段code还有下面的一种写法。功能完全一样,但是我们一直在重复着第一种写法(或许很多的书中也是建议这么编码),你是否想过这其中的缘由?文章的主角是cache,所以你一定猜到了答案。那么cache是如何影响这2段code的呢?

2024-01-29 17:52:56 40

原创 component内多个uvm_analsys_port/imp的两种实现方法

在我们的验证环境中,某个component 需要接多路tlm的需求很常见,比如uvm书上介绍的,SCB需要接两路tlm,一路来自monitor,一路来自refmodel。除此之外,在稍微复杂一点,或者有多路输入输出的环境,我们的refmodel需要接收来自多个agent.mon的trans,然后经过ref之后送到SCB,本文介绍这两种场景的两种实现方法。

2024-01-29 17:05:04 430

原创 inside 的坑

if(i inside {[0:7]}) ,这样才能起效。

2024-01-29 15:13:04 141

转载 Xargs批量操作

在实际工作中因为各种各样的原因,可能需要对文件及文件内容进行批量化的操作。在 Linux 环境中,使用xargs命令可以方便地批量操作文件。xargs是给命令传递参数的一个过滤器,可以用于组合多个命令。xargs可以将管道或者标准输入数据转换成命令行参数,这正是文件处理过程中需要的一个桥梁。关于xargs命令的更多细节及参数,可以在命令行中输入man xargs查看。接下来举例一些可能遇到的场景。

2024-01-25 14:29:57 109

转载 GVIM 可视化模式

通过输入相应的可视化命令,就可以切换到不同的可视化模式。可视化模式的好处在于,不但可以大大提高操作的效率,而且还可以在做改动之前,就看到操作将影响的文本。如果重复行执行gv命令,就会在当前选中的文本和前一次选中的文本之间进行切换。在此模式下,用命令移动光标,光标起始位置和当前位置之间的文本将会以高亮显示。命令将删除高亮选中的文本并进入插入模式,在你输入文本并点击Esc返回之后,输入的文本将插入到块选中的每一行里。如果你已经在可视化模式下选择了若干文本,并且希望移动到已选择文本的另一结尾处,那么可以使用。

2024-01-24 15:19:35 63

转载 std::randomize 的陷阱

看起来像是和scope有关系,因此又设计了class内普通变量,结构体变量,结构体队列变量,class变量,class队列变量,进行测试。为了确认其原因,就换了XRUN工具,看看是否能够复现该问题。从结果可以看到,虽然约束了结构体里参数AA的范围是大于等于1,小于3,但仍出现了随机结果为0的情况。所以在std::randomize的使用时,需要主要传入的参数需要是普通型变量,避免队列中元素的索引。在近期的一个testcase调试中,遇到一个std::randomize随机结果不符合预期的现象。

2024-01-23 14:17:10 128

转载 [UVM] ral_model 读/写一次就hang住

寄存器访问时首先会将uvm_reg_bus_op转换为自定义的xaction形式,之后通过调用start_item和finish_item完成xaction的发送.发送完成之后,通过bus_req.end_event.wait_on()等待交互结束.调试ral模型时,调用write函数对寄存器进行写操作,发现操作没有完成.driver中在get_next_item之后也调用了item_done.开始以为是ral模型中参数配置错误导致的,分析完代码之后没有发现问题.3.调用end_tr。

2024-01-22 17:31:39 56

转载 【UVM】 uvm1.1d VS uvm1.2 objection 机制

将对应sequence配置到sequencer中的某个phase中后,phas的执行需要objection,这句config没有配置objection,因此需要在sequence中手动配置,而对于在显式启动的sequence而言。在UVM中,除了在各个task phase中会出现控制objection的情况,在default sequence的执行中需要进行objection的控制。objection会在以下环境中配置。

2024-01-22 17:20:37 91

原创 vcs 加速编译-分块编译

当我们的验证环境比较大的时候,尤其是soc仿真环境,编译一次可能就需要数小时,验证阶段我们很可能只是修改了我们的vseq或者checker,但是需要全部重新编译一次,又需要花费数小时,为了减少来回的迭代时间,减少不必要的重复编译,vcs userguide里面有提到分块编译的方法,经过笔者实测,可用并且效果明显,本文介绍一下flow,然后对比一下效果。

2024-01-19 16:45:29 1104

原创 VCS 中途手动ctrl+c 退出后复原fsdb文件

有时我们在跑仿真的过程中可能会发现case hang住了,已经没有必要继续跑下去了,但是还是想基于已经dump好的波形就行debug,如果直接ctrl+c,然后ctrl+d退出后会发现波形文件被损坏,无法正常打开,今天介绍一种解决办法,亲测有效。2. 这个时候我们敲入以下命令:fsdbDumpFinish , 这个命令会将fsdb波形的临时文件合并产生唯一的。1. 我们在仿真过程中在terminal直接敲:ctrl+c之后,这个时候系统会自动切入UCLI 命令窗口。这样就能正常打开verdi查看波形了。

2024-01-18 16:24:25 531

原创 GIT 命令

记录用到的有用的git 命令:

2024-01-08 14:49:44 383

原创 TCL学习笔记(持续更新)

TCL(tool common language)是一种通用工具语言,很多eda tool都支持tcl,学习了解一些tcl基本语法还是很有必要的。

2024-01-04 16:30:14 533

原创 用UCLI(TCL)控制verdi dump 波形

在我们的验证环境中,通常跟ucli打交道的地方是用来控制开始dump和结束dump 波形的时间,以及dump 的hierarchy。depth表示要加载波形的层次:0表示当前instance下的所有变量以及其它module实例的波形;1表示当前instance中的变量的波形,不包括当前instance中的其它module实例的波形;2表示包含当前instance以及其中的第一级子instance的波形;instance指定要加载波形的module名。+mda – 加载memory和MDA信号;

2024-01-04 15:51:52 1216

原创 Linux 命令

【代码】Linux 命令。

2023-12-15 10:08:38 397

转载 【UVM】ral_model 前门访问和后门访问

(1) uvm_hdl_check_path(string path): 检测path指定的信号是否存在;(2) int。

2023-12-14 16:12:21 391

原创 GVIM 命令

【代码】GVIM 命令。

2023-12-05 16:07:23 430

转载 画时序图的工具

在进行电路时序或总线时序的学习,研究,开发,教学时总是需要阅读和绘制波形图,一款好用强大的波形图软件将极大提高你的绘制效率,让你更准确专业的表达时序逻辑。波形图绘制五大神器如下:TimeGenAndyTimingWaveDrom。

2023-12-05 15:42:44 330

原创 GVIM 配置 for begin/end class/endclass 等配对

有时候我们的代码很长,或者结构比较复杂,多个if/else 或者begin/end 快嵌套,为了阅读方便,利用gvim插件实现块跳转还是很有实用性的,下面的.vimrc的配置,简单方便。

2023-12-04 16:17:36 732

转载 波形文件(wlf,vcd,fsdb,shm,vpd)的区别

在笔者测试的例子中,产生的fsdb文件为十几MB,shm文件为几十MB,而vcd文件则要几个GB的大小。就是各家不同的仿真或调试工具支持的文件类型,互不通用,但基本都可以由VCD文件转换而来(其实就是VCD文件的压缩版,因为只取仿真调试需要的数据,所以文件大小要远小于原始VCD文件),有的还提供与VCD文件的互转换功能。--------------------------------------强迫症分割线--------------------------------------不是一个通用的文件格式。

2023-11-29 10:56:06 709

原创 uvm环境获取系统时间的方法和使用案例

有时候我们想统计一下验证环境中某个步骤总共花费了多少时间,有什么比较方便的方法呢,利用$realtime理论上也是能做到的,不过这个和timescale绑定起来了,需要手动换算成单位是秒的数,现在提供一种利用Linux系统函数date来统计时间差的方法。1. 首先$system("date")的返回值是0,不能直接得到系统时间,例子中采用的是把系统时间打印到临时文件中,然后再读出来的方式来间接得到系统时间。2. 在想要统计的操作前后分别call 一次以上function,相减即是想要的结果。

2023-11-20 17:21:07 228

转载 赋值运算符重载函数(operator=)介绍

上面描述的对运算符“==”进行重载,之所以叫“重载”,是由于编译器在实现运算符“==”功能的时候,已经针对这个运算符提供了对于一些基本数据类型的操作支持,只不过现在该运算符所操作的内容变成了我们自定义的数据类型(如 class),而在默认情况下,该运算符是不能对我们自定义的数据类型进行操作的。那么,在设计 person 类的时候,就可以通过针对运算符“==”进行重载,来使运算符“==”具有比较对象 p1 和 p2 的能力(实际上比较的内容是 person 类中的数据成员“age”)。

2023-09-22 16:37:17 351

转载 类的大小(sizeof)

静态数据成员被编译器放在程序的一个global data members中,它是类的一个数据成员,但不影响类的大小。* 把A的成员拆开看,char为1,int为4,所以是1+(3)+4+1+(3)=12,()为字节补齐。* @brief 8 8 16 派生类虚继承多个虚函数,会继承所有虚函数的vptr。* @brief 对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针,vptr的大小。* @brief 对于虚单函数继承,派生类也继承了基类的vptr,所以是8字节。* @author 光城。

2023-09-22 14:56:55 73

转载 static那些事

在上面的程序中,对象在if块内声明为非静态。因此,当创建对象时,将调用构造函数,并且在if块的控制权越过析构函数的同时调用,因为对象的范围仅在声明它的if块内。就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。由于声明为static的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量。允许静态成员函数仅访问静态数据成员或其他静态成员函数,它们无法访问类的非静态数据成员或成员函数。就像变量一样,对象也在声明为static时具有范围,直到程序的生命周期。

2023-09-21 16:59:31 40

转载 C++ 一种数组快速排序方法详解

以下就是我对分治:快速排序的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对分治算法的理解,请持续关注我哦!(2)向左走,从数组的右边位置向左找,一直找到小于等于 pivot 的数,找到R[j]=12,R[i]与R[j]交换,i++。(4)向左走,从数组的右边位置向左找,一直找到小于等于 pivot 的数,找到R[j]=18,R[i]与R[j]交换,i++。(6)然后在分别对这两个序列(12,24,5,18)和(36,58,42,39)进行快速排序(递归)。

2023-09-07 15:50:13 427

转载 隐式转换和显示转换

将dynamic_cast用于引用时,其用法稍有不同:没有与空指针对应的引用值,也就是说没有空引用,引用必须要初始化,因此无法使用特殊的引用值来指示失败,当请求不正确时,dynamic_cast将引发bad_cast异常。可以由reinterpret_cast执行但不能由static_cast执行的转换是基于重新解释类型的二进制表示的低级操作,在大多数情况下,这将导致特定于系统的代码,因此不可移植。C++是一门强类型的语言,许多转换,特别是那些暗示值的不同解释的转换,需要显式转换,在c++中称为类型转换。

2023-09-05 17:23:24 206

验证中相关的常用Linux命令,有备无患

总结了验证环境中常用的一些Linux命令,值得收藏

2023-05-26

fpga跨时钟设计

fpga跨时钟设计,深入浅出探讨fpga跨时钟操作方法,很适合初学者学习

2017-10-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除