- 博客(25)
- 资源 (3)
- 收藏
- 关注
原创 Makefile初学者快速入门
检查更新:如果依赖项已存在,make会检查依赖项的时间戳是否比目标的时间戳更新。伪目标并不是实际要生成的文件名,而是用来执行某些命令或作为依赖关系的标签。检查依赖项:在生成目标之前,make会检查规则中的依赖项是否存在。当make后不带任何目标时,make会默认执行Makefile文件中的第一个目标,在该示例中就是test。该命令是指定一个非标准名称的Makefile文件,默认的标准名称为Makefile或makefile。目标:指的是要生成的文件名称,或者是执行的伪目标名称,如test、clean。
2025-03-30 17:21:19
263
原创 RISC-V 执行
执行完成后并不会将结果马上更新到逻辑寄存器堆(ARF),而是会先写到临时的地方,如物理寄存器堆(PRF),当一条指令顺利退休时,才会对处理器的状态进行更新。在执行阶段,接收指令的源操作数,对其进行对应的操作,比如加减乘除、访问存储器等。执行阶段另一重要部分是旁路网络(bypassing network),它主要将FU的运算结果马上送到需要它的其他地方,如物理寄存器堆、所有FU的输入端、store buffer中等。4.特殊指令,用来实现一些特殊功能的指令,如操作TLB的指令等。
2025-02-23 16:41:14
271
原创 RISCV-V 片内总线TileLink
TileLink的设计目标是为片上系统提供一个具有低延迟和高吞吐率传输的高速、可扩展的片上互连方式,来连接通用多处理器、协处理器、加速器、DMA以及各类简单或复杂的设备。TileLink 协议一共有3种,TL-C 包括A、B、C、D、E所有5个通道,TL-UL和TL-UH 只包含A和D两个通道。是主接口到从接口,携带对通道B请求作为响应的消息发送给一个特定缓存数据块,也被用于自发地写回脏缓存数据。是从接口到主接口,携带对通道A发送到特定地址请求作出响应的消息,还携带了对于通道C自发写回的应答。
2025-02-15 16:25:00
427
原创 RISC-V 发射
发射,简单讲就是将符合一定条件的指令从发射队列(Issue Queue)中选出来,并送到FU中执行的过程。发射队列的作用是使用硬件保存一定数量的指令,然后从这些指令中找出可以执行的指令,不管指令的原始顺序,这就是指令的乱序执行。发射队列在这个过程中起到了关键作用,它的好坏决定了处理器的并行度。对于顺序执行的处理器而言,指令按照原始的顺序写到发射队列中,只有最旧的那条指令的源操作数都准备好了,该指令才会被发射。发射队列会按照一定的规则,选择源操作数都已经准备好的指令,将其送到FU中执行,这个过程称为发射。
2024-09-01 16:01:05
338
原创 RISC-V 寄存器重命名
有限个数的寄存器导致了假相关性的存在,最好的解决办法是使用硬件管理的寄存器重命名(Register Renaming),处理器中实际存在的物理寄存器个数远远多于指令集中定义的通用寄存器的个数,通用寄存器也叫逻辑寄存器。处理器在进行寄存器重命名时,会动态地将逻辑寄存器映射到物理寄存器,重命名映射表(Register Alias Table,RAT)用来保存已经存在的映射关系,空闲寄存器列表(Free Register List)用来保存未被映射的物理寄存器。数据相关性的三种类型,WAW、WAR、RAW。
2024-09-01 15:03:11
365
原创 RISC-V 指令解码
然而,RISC指令集中仍存在一些比较“另类”的指令,这些指令不能使用一般指令的处理方式,需要特殊处理。由于这些“另类”的指令使用频率不高,没有必要在后续的流水线增加硬件来对它们进行处理,只需在解码阶段将它们转换为一般的指令,后面的流水线按照普通指令的处理方式来执行它们即可。除此之外,影响处理器解码复杂度的因素还有每周期可以解码的指令个数,每个指令都对应一个完整的解码电路,所以对于一个周期可以解码n条指令的处理器而言,就需要n个解码电路,这就增加了解码电路的复杂度。
2024-08-25 17:56:37
308
原创 RSIC-V 分支预测
(2)间接跳转,目标地址通常存在于通用寄存器中,由于是通用寄存器,所以可以跳转到程序的任意地方,同时目标地址也是其他指令的执行结果。在没有得到最终的目标地址之前,当前执行的预测方向上的指令又可能都是错的,这就增加了分支预测失败时的惩罚。1.方向,指令有跳转指令和非跳转指令两种,跳转指令中又包含无条件跳转和有条件跳转,例如jump指令是无跳转指令,branch指令是有条件跳转。2.目标地址,如果指令需要跳转,那么就需要知道跳转的目标地址,而跳转目标地址也会存在于指令中。
2024-08-10 16:07:21
423
原创 RSIC-V Cache设计
如下图所示,我们可以将DRAM看作是硬盘/闪存的Cache,L2 Cache看作是DRAM的Cache,L1 Cache看作是L2的Cache。
2024-08-04 15:19:47
515
原创 RSIC-V 虚拟存储器技术
在早期的操作系统中,程序规模小,以致于物理内存可以容纳程序。但随着应用程序的规模越来越大,现有的物理内存已经无法容纳这样规模的程序了。其基本原理是程序的规模可以超过实际的物理内存,操作系统首先将程序内容的一小部分存储在物理内存中,将剩余的大部分内容放在下一级存储器,如磁盘等,后续根据需要交换物理内存与磁盘的内容,从而实现超过实际物理内存的程序正常运行。虚拟存储器的大小由处理器的位数决定,32位的处理器对应4GB的虚拟存储空间,64位的处理器对应。TB的虚拟存储空间。
2024-07-28 14:18:57
246
原创 UVM中的sequence
当只施加一种激励时,上述方法是可行的。但是如果需要对DUT施加不同的激励时,就需要对上述的main_phase进行修改。##1. sequence的由来。
2023-02-12 10:16:26
479
原创 UVM验证-objection机制
1、objection机制objection字面的意思就是反对、异议,主要面向于task phase。在验证平台中,可以通过drop_objection来通知系统可以关闭验证平台。例如:task driver::main_phase(uvm_phase phase);phase.raise_objection(this);//检测到有objection被提起,该phase中的代码被执行#100;phase.drop_objection(this);//撤销objectionendtasktas
2022-02-14 16:17:57
1514
1
原创 UVM验证-覆盖率
1、代码覆盖率行覆盖率(Line Coverage):衡量多少行代码被执行过;有限状态机覆盖率(FSM Coverage):衡量状态机中哪些状态和状态转换被执行过;翻转覆盖率(Toggle Coverage):衡量哪些单bit信号0/1翻转被执行过;分支覆盖率(Branch Coverage),也称路径覆盖率(Path Coverage):衡量哪些if、case、for、forever、while等语句分支被执行过;条件覆盖率(Condition Coverage):衡量哪些条件中逻辑操作数被执行
2022-02-08 10:46:38
6541
原创 UVM 通信方式
1、UVM中的analysis 端口包含有analysis_port和analysis_export两种端口,它们与port、export和imp的主要区别在于:第一,默认情况下,analysis_port(analysis_export)可以连接多个IMP,而put和get系列端口连接一个IMP(除非在例化时修改连接数量)。第二,analysis_port和analysis_export没有阻塞与非阻塞之分,而put和get系列端口有阻塞与非阻塞之分。第三,put系列端口有put、try_put和
2022-01-30 11:48:57
4020
原创 System Verilog功能覆盖率的简单例子
1、定义类class Transaction;rand bit[31:0] data;rand bit[7:0] addr;endclass2、定义覆盖组covergroup Coovoint;coverpoint tr.addr;coverpoint tr.data;endgroup3、收集覆盖率Transaction tr;CovPoint ck;tr=new();ck=new(); //实例化覆盖组repeat(16)beginassert(tr.randomize);
2022-01-15 09:24:01
410
2
原创 UVM验证之config_db机制
1、set与get函数参数介绍config_db机制用于UVM验证平台之间的参数传递。set函数为寄信,get函数为收信,它们通常成对出现。比如:在某个用例的build_phase中使用如下方式寄信:uvm_config_db#(int)::set(this,“env.agt.driver”,“para”,10);set函数中,第一个参数和第二个参数组成目标路径,与此目标路径相同的目标才会成功收信。第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示一
2022-01-03 22:47:36
1390
原创 System Verilog功能覆盖率-覆盖率类型
1、代码覆盖率这种方式主要包括行覆盖率、路径覆盖率、翻转覆盖率、有限状态机覆盖率。其中,行覆盖率:衡量多少行代码被执行过;路径覆盖率:衡量穿过代码和表达式的路径有多少被执行过;翻转覆盖率:衡量哪些单bit变量的值为0或者1;有限状态机覆盖率:衡量状态机中哪些状态和状态转换已经被执行过。...
2021-12-29 21:31:09
1855
原创 System Verilog验证之数据类型
1、逻辑(logic)类型logic不同于reg和wire类型,它不仅可以作为一个变量,还可以被连续赋值、门单元和模块所驱动,但是logic类型只能有一个驱动。2、双状态数据类型System Verilog双状态数据类型有bit(无符号)、byte(有符号)、shortint(有符号)、int(有符号)、longint(有符号)。值得注意的是,当将双状态变量连接到DUT时,DUT输出的X或Z值,会被转换成双状态值,从而导致变量未知值的传播而未被测试代码检测出来。这里推荐使用($ isunknown)
2021-12-28 23:52:08
327
原创 UVM验证之field automation机制
1、field automation机制相关的宏uvm_field系列宏有如下几种:uvm_field_int(ARG,FLAG)uvm_field_real(ARG,FLAG)uvm_field_enum(T,ARG,FLAG)uvm_field_object(ARG,FLAG)uvm_field_event(ARG,FLAG)uvm_field_string(ARG,FLAG)上述宏分别用于注册整数、实数、枚举类型、uvm_object类型、事件、及字符串类型。...
2021-12-27 15:24:09
3817
原创 UVM验证之phase机制
1、task phase与function phase根据是否消耗仿真时间,uvm phase分为两大类:一类是function phase
2021-12-26 23:20:29
3126
原创 UVM验证:DPI-C引用外部C函数编译问题
在SV文件中通过import “DPI-C” function c_function(para0,para1,…,paran)声明外部C函数时,如果C函数参数的方向没有写完整,编译时会报错。正确的做法是:import “DPI-C” function c_function(input para0,input para1,…,output paran);切记参数方向一定要写完整。...
2021-12-22 13:20:44
1361
原创 UVM验证:uvm_do_on_with函数随机化约束问题及解决方案
比如:为了增强代码的可读性,我们通常会将顶层和底层的seq变量定义为相同名称,在顶层top_vseq中启动底层sub_seq时,'uvm_do_on_with(sub_seq,{a == a});这个约束是无法生效的。1、约束不生效的原因从编译器的角度出发,它不知道两个变量a有什么不同,并且会把它做为sub_seq作用域中的两个相同变量,这就导致约束失效。2、解决方案将顶层变量和底层变量定义成不一样的名称,比如:顶层变量定义为a,底层变量定义为rand_a,然后执行’uvm_do_on_with(s
2021-12-22 13:10:08
6876
原创 system verilog验证(二)之约束
随机化约束,顾名思义就是让被随机的变量得到期望的数值。比如: 定义了一个随机化类rand_class rand class rand bit[7:0]a; randc bit[15:0]b; endclass rand_class rand_class_r; 不加任何约束的话,执行rand_class_r.randomize()之后,a的值范围为0~255,b的值范围为0~65535。如果我们想要得到a的值...
2021-12-21 21:30:31
359
原创 system verilog验证(一)随机化
system verilog中的随机激励一般以类为单位进行随机产生,该类包含一个或多个随机变量,并且随机变量必须使用rand或者randc修饰符进行修饰。建立好带有随机变量的类之后,通过调用randomize()函数即可完成随机。下面通过一个简单的例子进行说明。 1、定义随机类 class Case_class; rand bit[31:0]a; randc bit[7:0]b; endclass 2、调用randomize...
2021-12-19 22:50:39
508
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人