- 博客(121)
- 资源 (1)
- 收藏
- 关注
原创 一些有用的SVA小技巧
(1)表达式a ##[1:$ ] b #̲#[1:$] c表明,如果信号a为高,那么从下一个时钟周期开始信号b最终将为高,接着在下一个时钟周期开始信号c最终也会为高。intersect构造要求两个序列必须在相同时刻开始且在相同时刻结束,即:两个序列的起始点和结束点都要相同。(3)最终属性P62的含义为:从序列的开始有效点(信号a为高)到序列成功的结束点(信号c为高),一共经过2~5个时钟周期。(2)使用1[*2:5] intersect来加以约束,1[*2:5]表示1持续2~5个周期。
2024-09-27 14:34:51
527
原创 formal工具FPV使用tips
1. VCS起效的时间是time 0,VC formal起效的时间是reset完成,reset完成的时候,其他信号不做特别约束的情况是,会是从x态到0或者1,这样会误引入这个信号的下降沿或者上升沿,个别不健壮的assertion写法可能会fail。
2024-08-30 15:43:02
511
转载 Cache系列文章九:cache替换算法
Cache很小,主存很大。如果Cache满了怎么办?——对于直接映射,我们只能放到特定位置。如果这个位置原来已经有数据了,只需要把原来的数据替换掉,所以采用直接映射方式不需要考虑替换算法到底要替换那一块的问题,因为只能放到固定的位置Cache的四种替换算法:随机算法(全相联映射)Cache块满了的话,随机选择一块替换CPU进行访存时,若未命中,则先访问对应的主存块,并把信息调入/复制到对应的Cache块中。(每访问一个主存块就一定需要把这主存块立即调入Cache)
2024-07-26 18:25:36
1064
1
转载 xprop 对posedge/negedge判定的影响
但是目前的情况是一个芯片规模非常大,导致对整个芯片进行gate仿真不现实,这种情况下可以使用xprop,这是xprop 仿真模型的用处所在。3. xprop的功能就是提前在rtl仿真的过程中可以提前发现gate-level仿真中的一些bug。在芯片前端开发的后期,验证工程师需要进行xprop仿真验证,之前我只是简单的打开xprop的功能,去回归一些case看会不会fail并进行debug。1. xprop 仿真适用于前期的rtl仿真,对于gate-level仿真是没有任何作用的(下面的例子我会讲到)
2024-05-15 14:55:51
323
转载 前仿xprop 选项对仿真的影响
在使用VCS进行仿真时,工程师们常常会面对一个极为重要且充满挑战的问题——X态传播行为。X态信号代表了未知或不确定的逻辑值(或者高阻Z态),可能会在设计中引入意想不到的问题,因此如何处理X态成为了芯片设计与仿真中的一个关键议题。VCS提供了仿真选项-xprop=vmerge/tmerge/xmerge来处理和扩散X态传播问题。本文将深入探讨仿真中的X态传播行为,着重于不同仿真选项对X态传播的影响,以及应对X态隐匿和扩散的一些方法。进一步查询可以明确,不加入-xprop选项时默认的仿真行为是vmerge。
2024-05-15 14:49:12
1605
转载 CHI协议(6)
举个简单例子,假设在银行的服务器上,一个进程负责处理某个用户的账户余额,如果别的进程也来修改这段的数据,那么就需要一定的机制保证这段数据不会乱掉。其中一个比较常见的算法是CAS(Compare And Set),顾名思义,就是读出某段内存地址的数据,如果跟期望值一样,那么就改写该数据,如果与期望值不一样,就认为此次操作失败。对应到处理器端的操作,最简单的机制是先读出数据,计算新的数据值,再次读出该地址数据,如果与第一次读出的值一样,就认为这段时间内没有其它访问,可以把新数据写回,完成此次操作;
2024-04-28 16:08:23
422
转载 CHI协议(5)
但是如果缓存中的数据(可能)不唯一,就牵扯到了缓存一致性,修改它的处理器必须通知其它也拥有该拷贝的缓存控制器并得到响应,要么无效掉(invalidate)其它的拷贝,要么更新(update)其它的拷贝,这些就是高速缓存的“写无效”和“写更新”策略,忘了的同学可以看看前面讲cache的文章《必须对其它缓存的该缓存行进行无效后,获得U态后才能将该缓存行进行改写。UCE:Unique Clean Empty,该缓存行的数据只在当前缓存中,但是所有的数据都是无效的,可以不知会其它RN就对该缓存行的数据进行修改。
2024-04-28 16:07:12
450
转载 CHI协议(4)
当Completer对request进行retry,它需要记录该笔request的来源,也需要决定和记录Protocol Credit的类型,因为后续PCrdGrand的P-Credit type要和RetryAck中的一致。对于访问Non-cacheable或Device memory的read transaction,RespSepData或CompData响应可以保证对同一端点地址范围的transaction会被任何agent随后的transaction观测到,端点的地址范围取决于具体实现;
2024-04-28 16:05:55
424
转载 CHI协议(3)
通过node ID可以在ICN路由,RN和HN,HN和SN之间有不同的通道,每个通道有自己字段(fields),对于transaction request,data,snoop request和response来说,包含的字段不一样。也可以直接跳过HN,返回数据给原始Requester,这样可以减少读数据的延时。在基于CHI的系统中,处理器的读请求可以通过很多种来源得到数据,比如:互连中的cache(一般是last level cache),SN(存储设备)或者其它的RN-F(拥有该数据的缓存行)。
2024-04-28 16:04:01
644
转载 CHI协议(2)
CHI协议支持的NodeID字段宽度在7~11bits之间,由具体实现决定,且一个系统中所有组件的NodeID字段宽度必须一样,至于每个组件的NodeID值也是由具体实现决定的。首先,CHI协议规定,系统中的每个节点必须有一个节点号(Node ID)。链路层,基于flit。CHI的通道,有收/发两个方向,在发送方向上,有三个通道分别是REQ,WDAT和SRSP;我们知道在AXI和ACE协议中,处理器和ICN,或者ICN与从设备之间的数据传输是通过通道(channel)完成的,同样在CHI中也有通道的概念。
2024-04-28 16:02:12
347
转载 CHI协议(1)
目前常用的SoC互连是下图中的方式:交叉开关(crossbar),这种结构相对简单,互连部分延时小,多用于数量不多的组件互连,缺点是如果互连组件太多,这种结构的内部走线会非常多,不利于物理实现,比较常见的crossbar类型IP如ARM公司的NIC-400;二维网格(mesh),这种拓朴结构可以提供更大的带宽,而且是可以模块化,通过增加网格的行或列来增加更多的节点,ARM的CMN-600就是基于mesh的互连IP。除去自夸部分,首先我们能看出来,从CHI开始协议分层了,这是跟以往的总线协议不同的;
2024-04-28 15:57:40
483
转载 CHI 协议介绍
一致性总线接口(CHI)是AXI一致性扩展(ACE)协议的演进。它是Arm的AMBA总线的一部分。AMBA是一种免费可用、全球采用的开放标准,用于SoC中功能模块的连接和管理。它有助于一次性正确开发具有大量控制器和外设的多处理器设计。CHI适用于需要一致性的各种应用,包括移动、网络、汽车和数据中心。AMBA CHI旨在维护组件数量和流量不断增长的系统中的性能。CHI旨在实现可扩展性,用于构建小型、中型或大型系统。
2024-04-25 16:59:58
4136
原创 [VIM] MiniBufExplorer插件
我们在开发环境或者debug环境的时候,经常需要在不同的路径下的不同file中切换,一种可行的方法是开多个vim窗口,并排放着,需要开哪个的时候点哪个,但是打开的file很多的时候就不太方便了,这里推荐一个vim 插件:MiniBufExplorer。下载安装方法比较简单,有很多教程,我就不介绍了,使用方法也有人提到,但是不够清晰明了,这里梳理一下,以备所需。
2024-04-18 15:50:10
667
原创 [Verdi] fsdbreport的妙用
到处到文本中后,我们就可以利用gvim相关命令简单处理成方便对比的形式,比如文本排序sort等。1.数据只在跳变的时候写出。
2024-03-14 16:32:00
3160
原创 gvim自动对齐插件--Align
我们在看别人的代码的时候,一定看到过有人的代码看起来非常的美观,缩进对齐这些都非常的工整,这里推荐一款自动对齐的插件,经过实测,简单方便又好用。
2024-02-29 15:35:19
1882
2
原创 利用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
294
转载 Linux 好用的比较文件/目录的工具---Meld
Meld 是我处理代码和数据文件的基本工具之一。它是一个图形化的 diff 工具,因此,如果你曾经使用过diff命令并难以理解输出,那么可以为你提供帮助。Meld 是跨平台的,它有一个使用包管理器的。尽管它在 macOS 上不受官方支持,但有有关,请参见 Meld 的主页。
2024-02-05 15:18:12
2474
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
169
转载 Cache 系列文章7:atomic实现原理
借助多核Cache一致性协议可以很方便实现原子操作。当然远不止上面举例说的atomic_inc还有很多其他类似的原子操作,例如原子比较交换等。
2024-01-31 16:14:35
324
转载 Cache 系列文章6:多核Cache一致性
多核Cache一致性由硬件保证,对软件来说是透明的。因此我们不用再考虑多核Cache一致性问题。另外,现在CPU硬件采用的一致性协议一般是MESI的变种。例如ARM64架构采用的MOESI Protocol。多一种Owned状态。多出来的状态也是为了更好的优化性能。
2024-01-31 16:01:30
387
转载 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
1949
转载 Cache 系列文章4:Cache和DMA一致性
DMA应该多多少少知道点吧。DMA(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到内存的技术。这个过程中可以把CPU解放出来,可以很好的提升系统性能。那么DMA和Cache有什么关系呢?这也需要我们关注?
2024-01-30 17:09:32
343
转载 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
190
转载 Cache 系列文章2:Cache的组织方式
VIVT Cache问题太多,软件维护成本过高,是最难管理的高速缓存。所以现在基本只存在历史的文章中。现在我们基本看不到硬件还在使用这种方式的cache。现在使用的方式是PIPT或者VIPT。如果多路组相连高速缓存的一路的大小小于等于4KB,一般硬件采用VIPT方式,因为这样相当于PIPT,岂不美哉。当然,如果一路大小大于4KB,一般采用PIPT方式,也不排除VIPT方式,这就需要操作系统多操点心了。
2024-01-30 15:51:33
283
转载 Cache 系列文章1:Cache的基本原理
对于没有接触过底层技术的朋友来说,或许从未听说过cache。毕竟cache的存在对程序员来说是透明的。在接触cache之前,先为你准备段code分析。如果你曾经学习过C/C++语言,这段code自然不会陌生。如此简单的将arr数组所有元素置1。你有没有想过这段code还有下面的一种写法。功能完全一样,但是我们一直在重复着第一种写法(或许很多的书中也是建议这么编码),你是否想过这其中的缘由?文章的主角是cache,所以你一定猜到了答案。那么cache是如何影响这2段code的呢?
2024-01-29 17:52:56
249
原创 component内多个uvm_analsys_port/imp的两种实现方法
在我们的验证环境中,某个component 需要接多路tlm的需求很常见,比如uvm书上介绍的,SCB需要接两路tlm,一路来自monitor,一路来自refmodel。除此之外,在稍微复杂一点,或者有多路输入输出的环境,我们的refmodel需要接收来自多个agent.mon的trans,然后经过ref之后送到SCB,本文介绍这两种场景的两种实现方法。
2024-01-29 17:05:04
945
转载 Xargs批量操作
在实际工作中因为各种各样的原因,可能需要对文件及文件内容进行批量化的操作。在 Linux 环境中,使用xargs命令可以方便地批量操作文件。xargs是给命令传递参数的一个过滤器,可以用于组合多个命令。xargs可以将管道或者标准输入数据转换成命令行参数,这正是文件处理过程中需要的一个桥梁。关于xargs命令的更多细节及参数,可以在命令行中输入man xargs查看。接下来举例一些可能遇到的场景。
2024-01-25 14:29:57
394
转载 GVIM 可视化模式
通过输入相应的可视化命令,就可以切换到不同的可视化模式。可视化模式的好处在于,不但可以大大提高操作的效率,而且还可以在做改动之前,就看到操作将影响的文本。如果重复行执行gv命令,就会在当前选中的文本和前一次选中的文本之间进行切换。在此模式下,用命令移动光标,光标起始位置和当前位置之间的文本将会以高亮显示。命令将删除高亮选中的文本并进入插入模式,在你输入文本并点击Esc返回之后,输入的文本将插入到块选中的每一行里。如果你已经在可视化模式下选择了若干文本,并且希望移动到已选择文本的另一结尾处,那么可以使用。
2024-01-24 15:19:35
177
转载 std::randomize 的陷阱
看起来像是和scope有关系,因此又设计了class内普通变量,结构体变量,结构体队列变量,class变量,class队列变量,进行测试。为了确认其原因,就换了XRUN工具,看看是否能够复现该问题。从结果可以看到,虽然约束了结构体里参数AA的范围是大于等于1,小于3,但仍出现了随机结果为0的情况。所以在std::randomize的使用时,需要主要传入的参数需要是普通型变量,避免队列中元素的索引。在近期的一个testcase调试中,遇到一个std::randomize随机结果不符合预期的现象。
2024-01-23 14:17:10
619
转载 [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
362
转载 【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
547
原创 vcs 加速编译-分块编译
当我们的验证环境比较大的时候,尤其是soc仿真环境,编译一次可能就需要数小时,验证阶段我们很可能只是修改了我们的vseq或者checker,但是需要全部重新编译一次,又需要花费数小时,为了减少来回的迭代时间,减少不必要的重复编译,vcs userguide里面有提到分块编译的方法,经过笔者实测,可用并且效果明显,本文介绍一下flow,然后对比一下效果。
2024-01-19 16:45:29
2375
原创 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
1683
原创 TCL学习笔记(持续更新)
TCL(tool common language)是一种通用工具语言,很多eda tool都支持tcl,学习了解一些tcl基本语法还是很有必要的。
2024-01-04 16:30:14
881
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人