- 博客(42)
- 收藏
- 关注
原创 reg_if的代码逻辑分析
更新操作: 在非复位状态下,这段代码将从外部输入 slv0_free_slot_i 到 slv3_free_slot_i (从设备0到3的空闲槽位) 和 slv0_parity_err_i 到 slv3_parity_err_i (从设备0到3的奇偶校验错误) 的值更新到 ro_mem 数组中对应的寄存器。is_addr_parity_err_0_s 到 is_addr_parity_err_3_s: 地址匹配四个从设备的奇偶校验错误寄存器 (ro_mem[4] 到 ro_mem[7])
2024-11-19 01:29:53
608
原创 MCDF的testcase
硬件复位序列 (uvm_reg_hw_reset_seq): 这个序列模拟硬件复位过程。然后,它重置寄存器模型 (rgm.reset()) 并启动 uvm_reg_hw_reset_seq 序列。位翻转序列 (uvm_reg_bit_bash_seq): 这个序列对寄存器中的每一位进行翻转,以检测潜在的错误。在执行此序列之前,它会先将复位信号置低,等待一段时间再置高,并重置寄存器模型。寄存器访问序列 (uvm_reg_access_seq): 这个序列执行一系列的寄存器读写操作,以验证寄存器的功能。
2024-11-18 22:54:49
297
原创 mcdf_env代码环境分析
数据通过监视器流向记分板(chker)进行功能验证,并流向分析器(analyzer)进行性能分析。代理:chnl_agts(通道代理)、reg_agt(注册代理)和fmt_agt(格式化代理)在各自的接口上驱动和监视事务。记分牌:chker(mcdf_checker)将监控的事务与参考模型中的预期值进行比较,以验证功能的正确性。Virtual Sequencer:virt_sqr协调多个代理之间的事务顺序,确保正确的排序和同步。寄存器模型:rgm提供寄存器的模型,包括它们的地址和字段。
2024-11-18 22:21:05
214
原创 uvm_config_db内部代码功能解析
它提供 turn_on_tracing()、turn_off_tracing() 和 is_tracing() 函数来控制跟踪的开关,并通过 init() 函数在初始化时检查命令行参数 +UVM_CONFIG_DB_TRACE 来设置跟踪选项。m_waiters[string]: 这是一个静态的 uvm_queue,用于管理等待配置参数修改的等待器 (m_uvm_waiter)。跟踪: 如果开启了跟踪 (uvm_config_db_options::is_tracing()),则显示设置信息。
2024-11-17 00:29:05
759
原创 SV随机约束编写案例
数组 data 的大小必须是 4、8、16 或 32,并且数组元素的值与 addr 存在固定的偏移关系,每个元素的偏移量是 4 个字节。soft 关键字表明这些约束是软约束,系统会优先满足这些约束,但如果无法满足,则可以生成不满足约束的值,不会导致仿真错误。它表示数组 data 中的每个元素 data[i] 的值必须等于 addr 加上 i 左移两位的结果 (i
2024-11-17 00:25:27
418
原创 覆盖率组covergroup编写案例
这段代码定义了一个名为 cg_apb_write_read_order_group 的 covergroup,用于收集 APB 总线写操作和读操作顺序的覆盖率信息。(1 => 0): 表示当 pwrite 的值为 1(写操作)且前一个周期 pwrite 为 0(读操作)时,该 bin 的计数器加 1。(1 => 1): 表示当 pwrite 的值为 1(写操作)且前一个周期 pwrite 也为 1(写操作)时,该 bin 的计数器加 1。write_read_order: coverpoint 的名称。
2024-11-17 00:22:20
353
原创 APB验证平台搭建案例
这段代码是一个 UVM 验证平台的片段,用于测试 APB 总线。它包含了环境类、测试类和测试序列类,分别负责搭建测试环境、运行测试和产生测试激励。代码使用了随机化和约束来生成各种测试用例,并包含了数据校验功能。apb_pkg 包含了具体的 APB 总线事务定义和 agent 实现。该代码实现了单事务和 burst 事务的测试。local:: 用于访问局部变量。
2024-11-17 00:17:58
269
原创 APB覆盖率收集点定义案例
iff rstn 表示只有在 rstn 为高电平(非复位状态)时才进行采样。has_checks 和 has_coverage 是可配置的标志位,允许用户启用或禁用检查和覆盖率收集。cg_apb_trans_timing_group: 收集 APB 事务时序的覆盖率,例如单次事务和不同长度的 burst 事务。cg_apb_write_read_order_group: 收集 APB 写和读操作顺序的覆盖率。cg_apb_command: 收集 APB 命令 (pwrite 和 psel) 的覆盖率。
2024-11-17 00:14:01
156
原创 uvm_tlm_fifo内部代码的相关方法和功能
uvm_tlm_analysis_fifo 提供了无限容量的 FIFO,并通过分析接口与其他组件通信,适合用于连接分析端口和目标组件,减少阻塞,提高效率。我们现在就UVM TLM FIFO 类来拆解uvm_tlm_fifo 的相关方法和功能,代码中包含了uvm_tlm_fifo 和 uvm_tlm_analysis_fifo。阻塞:uvm_tlm_analysis_fifo 的 write 操作是非阻塞的,而 uvm_tlm_fifo 的 put 操作可能是阻塞的。put(): 将事务放入 FIFO。
2024-11-16 18:49:34
581
原创 寄存器模型集成总线UVC的示例
mcdf_bus_agent 类定义了 MCDF 总线的 agent,将驱动器、序列器和监控器组合在一起,并进行连接。mcdf_bus_trans 类定义了 MCDF 总线上的数据传输结构,包括命令、地址、写入数据和读取数据。mcdf_bus_monitor 类定义了 MCDF 总线的监控器,负责捕获总线上的事务并将其发送到分析器。mcdf_bus_sequencer 类定义了 MCDF 总线的序列器,负责生成和发送事务。使用分析端口,可以方便地将事务发送到分析器进行分析。
2024-11-14 22:21:38
217
原创 Layering Sequence介绍
adapter_seq 类定义了一个数据层到物理层适配器序列,它会将数据层事务转换为物理层事务,并发送给物理层 driver。phy_master_sequencer 类定义了物理层 sequencer,它会将物理层事务发送给物理层 driver。layering_sequencer 类定义了数据层 sequencer,它会将数据层事务发送给适配器序列。packet_seq 类定义了一个数据层序列,它会发送一系列物理层事务,模拟一个数据包的传输。顶层序列发送数据层事务给数据层 sequencer。
2024-11-14 15:34:32
412
原创 Sequencer和Sequence
通过finish_item()方法在对item进行了随机化处理之后,执行parent sequence的mid_do(),以及调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来将item发送至sequencer再完成与driver之间的握手。UVM_SEQ_ARB_FIFO:默认模式。第二,parent sequence的虚方法pre_do()、mid_do()、post_do()会发生在发送item的过程中间。
2024-11-14 15:30:42
1556
原创 TLM uvm_blocking_put_imp类的内部实现
uvm_blocking_put_imp 类是一个通用的阻塞式放入实现类,你可以根据需要对其进行扩展和定制。你可以通过继承它来创建自己的自定义类,例如 uvm_blocking_put_imp_chnl0,并添加一些特定于通道 0 的逻辑。UVM 提供的是一个名为 uvm_blocking_put_imp 的通用阻塞式放入实现类,你可以根据需要对其进行扩展和定制。你可以通过继承 uvm_blocking_put_imp 类来创建自己的自定义类,例如 uvm_blocking_put_imp_chnl0。
2024-11-13 17:29:48
272
原创 uvm_object基类
这段代码定义了两个类:ball 和 box,并展示了如何使用 uvm_object_utils_begin 和 uvm_object_utils_end 宏定义成员变量的拷贝和打印方法,以及如何使用 uvm_field_object 宏定义深拷贝。将默认打印器设置为 uvm_default_tree_printer,使用 uvm_default_tree_printer 打印 b1 对象,uvm_default_tree_printer 使用树形结构打印对象信息。
2024-11-07 12:37:28
1886
原创 UVM 覆盖机制
这意味着,当你使用 UVM 工厂创建该类型对象时,实际创建的是你的自定义类,而不是默认的类。如果你需要创建一个具有特定功能的组件,但 UVM 默认提供的组件无法满足你的需求,你可以通过类型覆盖来创建自己的组件类,并将其注册到 UVM 工厂中。在上面的示例中,我们创建了一个名为 my_sequence 的自定义序列类,并将其注册到 UVM 工厂,覆盖了 uvm_sequence 的默认实现。UVM 覆盖机制 是一种强大的功能,它允许你在 UVM 环境中定制 UVM 对象的行为,以满足你的特定需求。
2024-11-05 11:12:54
353
原创 UVM核心服务类uvm_coreservice_t的代码解析
uvm_coreservice_t 类是一个抽象基类,它定义了 UVM 核心服务的接口,用于获取 UVM 核心服务对象,例如工厂、事务数据库和报告服务器。提供核心服务对象: uvm_coreservice_t 类提供了获取 UVM 核心服务对象的方法,例如工厂、事务数据库和报告服务器。UVM 环境中的其他对象可以使用 uvm_coreservice_t 类提供的接口来获取和使用 UVM 核心服务对象。uvm_coreservice_t 类是 UVM 核心服务的基类,它定义了 UVM 核心服务的基本功能。
2024-10-30 15:01:55
294
原创 UVM机制uvm_object 的代码功能解析
名称管理: uvm_object 类提供了对象命名和路径管理功能,方便用户在 UVM 环境中识别和定位对象。uvm_object 类是 UVM 中所有对象的基类,它提供了一些基本功能,用于管理和操作 UVM 对象。UVM 测试用例和组件可以使用 uvm_object 类提供的功能来管理和操作 UVM 对象。uvm_object 类提供了 UVM 对象的基本功能,例如对象管理、名称管理和状态管理。对象管理: uvm_object 类提供了对象创建、销毁、复制和比较等基础功能。
2024-10-30 14:59:50
255
原创 UVM工厂uvm_factory代码组成解析
它将类型名称和对应的 uvm_object_wrapper 对象存储在 m_type_names 字典中。设置类型覆盖: set_type_override 函数用于设置类型覆盖,即使用指定的类型来覆盖原有的类型。m_types: 字典,用于存储 uvm_object_wrapper 对象和一个值,用于确保对象的唯一性。m_type_names: 字典,用于存储类型名称和对应的 uvm_object_wrapper 对象。m_type_overrides: 字典,用于存储类型名称和对应的类型覆盖。
2024-10-30 14:56:32
154
原创 UVM工厂机制宏定义和类定义、方法、变量定义
create_component_by_type(uvm_object_wrapper requested_type, string parent_inst_path=“”, string name, uvm_component parent): 用于根据类型创建组件。定义了一个静态函数 create,用于创建指定类型的组件。UVM 使用 uvm_coreservice_t 类来管理 UVM 核心服务,并使用 uvm_default_coreservice_t 类来提供 UVM 核心服务的默认实现。
2024-10-30 14:54:16
1306
原创 UVM宏定义m_uvm_component_registry_internal
当一个 UVM 组件被创建时,它会调用 m_uvm_component_registry_internal 宏来注册自身,并将类型信息存储在 uvm_component_registry 对象中。m_uvm_component_registry_internal 宏是 UVM 中一个重要的机制,它用于注册 UVM 组件的类型信息,方便 UVM 工厂和其他组件识别和操作组件,特别是对于泛型组件。定义一个类型别名 type_id,用于简化对 uvm_component_registry 类型的引用。
2024-10-30 14:49:23
312
原创 UVM注册机制宏定义m_uvm_component_registry_internal
当一个 UVM 组件被创建时,它会调用 m_uvm_component_registry_internal 宏来注册自身,并将类型信息存储在 uvm_component_registry 对象中。m_uvm_component_registry_internal 宏是 UVM 中一个重要的机制,它用于注册 UVM 组件的类型信息,方便 UVM 工厂和其他组件识别和操作组件。type_id::get() 返回一个 uvm_component_registry 对象,它包含了组件的类型信息。
2024-10-30 14:46:41
260
原创 UVM核心服务类宏定义UVM_CORESERVICE_TYPE和核心服务类class uvm_coreservice_t代码解析
UVM 组件和对象可以使用 uvm_coreservice_t::get() 函数来获取 UVM 核心服务对象,然后使用该对象来访问 UVM 核心服务,例如创建组件、注册对象、记录事务和报告错误。UVM 使用 uvm_coreservice_t 类来管理 UVM 核心服务,并使用 uvm_default_coreservice_t 类来提供 UVM 核心服务的默认实现。uvm_coreservice_t 类是一个虚类,它定义了获取 UVM 核心服务对象的接口。
2024-10-30 14:45:15
298
原创 SV和UVM动态转换和静态转换
这两种都属于显示转换,其他那种不需要转换的是隐式转换(如位宽不同的进行。静态转换:在表达式前加单引号,不会进行检查,如果转换失败,也不会报错。静态转换:col = Colors’(5)动态转换:$cast(col, 5);动态转换:使用系统函数$cast。
2024-10-30 09:42:21
149
原创 SV和VUM中$cast()的功能
cast() 是 SystemVerilog 中一个用于强制类型转换的系统函数,它可以将一个表达式的值转换为指定类型。它可以将一个表达式的值转换为指定类型,即使该表达式原本不属于目标类型。目标类型,可以是任何 SystemVerilog 数据类型,例如 int、real、string、struct 等。$cast() 也可以进行显式类型转换,即使目标类型与表达式类型不同,并且转换操作可能导致数据丢失。$cast() 可以进行隐式类型转换,即使目标类型与表达式类型不同,只要转换操作是合法的。
2024-10-30 09:22:54
403
原创 uvm_test类的功能和内部代码
通过继承 uvm_test 类,你可以创建自己的测试用例,并根据需要覆盖父类的函数和任务,编写更复杂的测试用例。测试流程管理: 它提供了 run_test() 任务,用于执行测试用例,并提供了 phase 机制,用于控制测试用例的执行顺序。测试用例的组织: uvm_test 类提供了一个框架,用于组织测试用例的执行流程,包括初始化、测试执行和结果分析等步骤。测试用例继承: 你可以继承 uvm_test 类来创建自己的测试用例,并根据需要覆盖父类的函数和任务。uvm_test类的功能和内部代码。
2024-10-29 18:30:31
238
原创 UVM中uvm_factory类的功能和内部代码
uvm_factory 类是 UVM 中的核心类之一,它负责管理和创建 UVM 对象。uvm_factory::get() 方法用于获取 UVM 工厂对象的唯一实例,该实例可以用来创建和管理 UVM 对象。现在,f 变量可以用来访问 UVM 工厂对象的方法,例如,创建新的 UVM 对象或查找已有的 UVM 对象。uvm_factory::get() 方法是一个静态方法,用于获取 UVM 工厂对象的唯一实例。uvm_factory 类是 UVM 中的核心类之一,它负责管理和创建 UVM 对象。
2024-10-29 18:15:02
255
原创 raise_objection挂起机制
raise_objection 挂起机制是 UVM (Universal Verification Methodology) 中一种重要的机制,用于控制仿真执行流程,确保各个组件以预期的顺序执行,并避免竞争条件。放弃异议 (Drop Objection): 当一个组件认为它已经完成了必要的操作,或者已经满足了等待的条件,它就可以调用 phase.drop_objection(this) 来放弃异议。异议优先级: 所有提出异议的组件都会被记录,并且只有所有组件都放弃了异议,当前阶段才会继续执行。
2024-10-29 11:25:38
436
原创 uvm_component_utils宏定义封装的systemVerilog代码逻辑
auvm_component_utils 是一个宏定义,而不是一个类。由于 uvm_component_utils 是一个宏定义,所以它的代码不是简单的类定义,而是更复杂的宏展开。uvm_component_utils 宏定义的代码实现位于 UVM 库的 uvm_pkg.svh 文件中,它被封装在 uvm_object_utils 宏定义中。uvm_component_utils 宏定义是一个强大的工具,它简化了 UVM 组件的初始化过程,并提供了许多辅助函数和属性,使 UVM 开发更加高效。
2024-10-29 11:10:03
361
原创 UVM的factory工厂的注册、创建和覆盖机制
现在,当使用 create 函数创建 my_object 对象时,会使用 my_object_factory 类中的自定义创建方法。工厂注册、创建和覆盖机制是 UVM 中非常重要的概念,它们提供了灵活的机制来创建和定制验证环境中的对象。通过工厂机制,你可以根据需要创建不同的对象类型,使用不同的配置参数,以及定制对象的创建过程。工厂覆盖是指使用自定义的创建方法来覆盖工厂的默认创建方法。override_by_name 函数允许你使用自定义的创建方法来覆盖默认的创建方法,但只对特定名称的对象有效。
2024-10-28 10:48:47
398
原创 UVM覆盖率
覆盖率的收集和分析有助于评估验证的质量,并确定需要进一步验证的方面。覆盖率目标 (Coverage Goal): 一个覆盖率目标代表对一个覆盖率点需要达成的覆盖率,例如一个状态机状态需要覆盖 100%,一个协议操作需要覆盖 90%。覆盖率点 (Coverage Point): 一个覆盖率点代表一个特定的覆盖率目标,例如一个状态机状态、一个协议操作或者一个功能模块的输入输出。代码覆盖率 (Code Coverage): 评估验证是否覆盖了 DUT 的所有代码,例如语句覆盖率、分支覆盖率、条件覆盖率等。
2024-10-28 02:33:27
380
原创 UVM 常见的主要知识点
UVM 使用 uvm_sequence 类来定义验证测试用例,并通过 uvm_sequencer 将测试用例发送到 uvm_driver 进行驱动。UVM 提供了一系列基础类,例如 uvm_object、uvm_component、uvm_sequence 等,作为验证组件的基类。UVM 提供了 uvm_report_object 类,用于发送和接收验证信息,例如错误、警告和调试信息。UVM 允许使用 uvm_config_db 进行配置,例如设置测试环境、测试用例和验证组件的属性。
2024-10-28 01:52:46
417
原创 SystemVerilog 中定义 struct 数据结构主要有两种方式
你可以使用 typedef 为命名结构体定义一个别名,例如 typedef struct student student_t;你可以使用 struct 结构体名称 来声明变量,例如 student student1;如果你需要多次使用同一个结构体,并且需要明确的名称,建议使用命名结构体。如果你只需要使用一次结构体,或者你希望代码更简洁,建议使用匿名结构体。结构体没有明确的名称,你需要使用 typedef 为它定义一个别名。结构体拥有一个明确的名称,方便你使用该名称来声明变量和访问成员。
2024-10-28 01:36:12
285
原创 systemVerilog常见的主要的知识点
基本数据类型: bit, logic, reg, wire, integer, real, time, string。覆盖组 (covergroup) 和覆盖点 (coverpoint): 用于定义覆盖率分析的范围和目标。赋值运算符: =, +=, -=, *=, /=, %=, ^=, &=, |=, =。过程块: initial, final, always, task, function。逻辑运算符: &, |, ^, ~^, &&, ||,!
2024-10-28 01:11:10
350
原创 采样寄存器相关的覆盖点有哪些
这可以通过UVM中的uvm_reg_hw_reset_seq来实现,确保在全部复位结束后,创建序列,将寄存器重置,并将重置值赋给序列的模型,然后启动1。:在验证过程中,功能覆盖率是一个重要的指标。:通过uvm_reg_bit_bash_seq进行位翻转测试,确保寄存器的每一位都能正确响应位翻转操作1。通过这些覆盖点的测试和验证,可以确保采样寄存器的功能正确性和完整性,从而提高验证质量和展现更真实的功能覆盖。:使用uvm_reg_access_seq进行寄存器的读写测试,确保寄存器的读写功能正常1。
2024-10-28 00:49:51
219
原创 怎么样计算覆盖率
计算覆盖率需要使用覆盖率工具,例如 SystemVerilog 中的 covergroup 和 coverpoint,以及其他工具,如 QuestaSim、VCS 等。覆盖率计算通常使用语句覆盖率、分支覆盖率等方法,并可以使用各种覆盖率工具来收集和分析覆盖率结果。a计算覆盖率需要使用覆盖率工具,例如 SystemVerilog 中的 covergroup 和 coverpoint,以及一些其他工具,如 QuestaSim、VCS 等。分析覆盖率结果: 仿真结束后,可以使用覆盖率工具来分析覆盖率结果。
2024-10-28 00:04:47
471
原创 system verilog中中semaphore使用方法
这意味着 semaphore 是您自定义的类或者结构体。您可能在代码的其他地方定义了一个名为 semaphore 的类,该类包含了 run_stop_flags 成员变量和其他相关方法。检查代码: 仔细检查您的代码,寻找 class semaphore 或 struct semaphore 的定义。搜索关键字: 在代码中搜索 semaphore 关键字,找到所有与 semaphore 相关的代码片段。使用 IDE 或编译器: 使用 IDE 或编译器可以帮助您快速定位到 semaphore 的定义位置。
2024-10-24 20:52:54
254
原创 system verilog中和UVM中进程同步的类似semaphore方法
uvm_object 的 wait_for_object 方法: 您可以使用 wait_for_object 方法来等待某个 UVM 对象(例如 uvm_sequence 或 uvm_driver)处于特定的状态,例如 started 或 finished。使用 uvm_resource_db: 您可以使用 uvm_resource_db 来管理可用的资源,并通过 uvm_resource_db 的 get 和 put 操作来模拟获取和释放信号量。在大多数情况下,UVM 提供的同步机制足以满足验证需求。
2024-10-24 20:48:51
354
原创 system verilog中semaphore 信号量赋予初值的方法
在 SystemVerilog 中,您可以使用 event 或 mailbox 来模拟 semaphore 功能,并通过初始化 event 的值或 mailbox 中存储的值来赋予初始值。other_task 任务可以随时将 semaphore 设置为 0,表示释放信号量,允许 access_resource 任务继续访问资源。access_resource 任务使用 wait(semaphore) 来等待 semaphore 事件触发,表示可以访问资源。使用 event 变量的触发来表示释放信号量。
2024-10-24 20:30:04
357
原创 system verilog中semaphore 同步机制
当线程或进程想要访问资源时,它会尝试获取一个信号量。如果计数器为 0,则线程或进程必须等待,直到其他线程或进程释放信号量,将计数器加 1。信号量 (Semaphore):信号量是一种同步机制,用于控制多个线程或进程对共享资源的访问。它可以看作一个计数器,每个线程或进程在访问资源之前都需要获取一个信号量,如果信号量的值小于或等于 0,则线程或进程必须等待其他线程或进程释放信号量。semaphore 是一种同步机制,它用于控制多个线程或进程对共享资源的访问,确保它们以正确的顺序和方式进行访问。
2024-10-24 20:27:40
246
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人