MCDF顶层验证方案

一、概述

MCDF的主要功能是将输入端的三个通道数据,通过数据整形和过滤,最终输出。

可以将MCDF的设计结构分别四个模块:

  • 上行数据的通道从端(channel slave)
  • 仲裁器(arbiter)
  • 整形器(formatter)
  • 控制寄存器(control registers)

二、reg_env

对于寄存器模块的验证环境reg_env,它的组织包括:

  • reg_master_agent,提供寄存器接口驱动信号。
  • reg_slave_agent,提供寄存器接口反馈信号。
  • scoreboard,分别从reg_master_agent内的monitorreg_slave_agent内的monitor获取监测数据,并且进行数据对比。

在这里插入图片描述

三、chnl_env

数据通道从端的验证环境chnl_env的组件包括:

  • chnl_master_agent,提供上行的激励数据。
  • chnl_slave_agent,提供用来模拟arbiter仲裁信号,并且接受流出数据。
  • reg_cfg_agent,用来提供模拟寄存器的配置信号,并且接收内置FIFO的余量信号。
  • scoreboard,分别从chnl_master_agentchnl_slave_agentreg_cfg_agentmonitor接收检测数据,并且对channel的流入流出数据进行比对。
    在这里插入图片描述

四、arb_env

仲裁器的验证环境arb_env的组件包括:

  • 模拟channel输出接口的arbiter_master_agent的三个实例,用来对arbiter提供并行数据输入,同时对arbiter反馈的仲裁信号做出响应。
  • arbiter_slave_agent,用来接收arbiter的输出数据,模拟formatter的行为,对arbiter的输出信号做出响应。
  • reg_cfg_agent,提供用来模拟寄存器的配置信号,对三个channel数据源分别做出不同的优先级配置。
  • scoreboard,从三个arbiter_master_agent、arbiter_slave_agent、reg_cfg_agent中的monitor获取监测数据,对arbiter的仲裁机制做出预测,并且将输入输出数据按照预测的优先级做出比对。

在这里插入图片描述

五、fmt_env

整形器的验证环境fmt_env的组件包括:

  • fmt_master_agent,用来模拟arbiter的输出数据。
  • fmt_slave_agent,用来模拟MCDF的下行数据接收端。
  • reg_cfg_agent,用来模拟寄存器的配置信号,用来指定输出数据包的长度。
  • scoreboard,从fmt_master_agent、fmt_slave_agent、reg_cfg_agent的monitor获取检测数据,通过数据包长度来预测输出的数据包,与formatter输出的数据包进行比对。

在这里插入图片描述

六、环境集成方案一

MCDF顶层验证环境复用了这些模块验证环境的组件,reg_master_agentchnl_master_agentfmt_slave_agent,通过这三个激励组件可以有效生成新的激励序列,而将各个agentsequencer句柄合并在一起时,virtual sequencer的作用就体现出来了,可以通过这个中心化的序列分发管道,将各个agentsequencer也集中管理。MCDF的scoreboard提供了一个完整的数据通路覆盖方案,即从各个agentmonitor的数据检测端口将数据收集起来,同时建立MCDF的参考模型,预测输出数据包,最终进行数据比对。

验证环境结构图

在这里插入图片描述
代码实现

class mcdf_env1 extends uvm_env;
	`uvm_component_utils(mcdf_env1)
	reg_master_agent reg_mst;
	chnl_master_agent chnl_mst1;
	chnl_master_agent chnl_mst2;
	chnl_master_agent chnl_mst3;
	fmt_slave_agent fmt_slv;
	mcdf_virtual_sequencer virt_sqr;
	mcdf_scoreboard sb;
	
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		reg_mst = reg_master_agent::type_id::create("reg_mst", this);
		chnl_mst1 = chnl_master_agent::type_id::create("chnl_mst1", this);
		chnl_mst2 = chnl_master_agent::type_id::create("chnl_mst2", this);
		chnl_mst3 = chnl_master_agent::type_id::create("chnl_mst3", this);
		fmt_slv = fmt_slave_agent::type_id::create("fmt_slv", this);
		virt_sqr = mcdf_virtual_sequencer::type_id::create("virt_sqr", this);
		sb = mcdf_scoreboard::type_id::create("sb", this);
	endfunction
	
	function void connect_phase(uvm_phase phase);
		super.connect_phase(phase);
		//virtual sequencer connect
		virt_sqr.reg_sqr = reg_mst.sequencer;
		virt_sqr.chnl_sqr1 = chnl_mst1.sequencer;
		virt_sqr.chnl_sqr2 = chnl_mst2.sequencer;
		virt_sqr.chnl_sqr3 = chnl_mst3.sequencer;
		virt_sqr.fmt_sqr = fmt_slv.sequencer;
		//monitor transactions to scoreboard
		reg_mst.monitor.ap.connect(sb.reg_export);
		chnl_mst1.monitor.ap.connect(sb.chnl1_export);
		chnl_mst2.monitor.ap.connect(sb.chnl2_export);
		chnl_mst3.monitor.ap.connect(sb.chnl3_export);
		fmt_slv.monitor.ap.connect(sb.fmt_export);
	endfunction
endclass

七、环境集成方案二

在方案一中最大的额外投入在于需要新建一个scoreboard用来检查MCDF的整体功能,而方案二的目的在于复用底层模块环境的scoreboard,减少顶层环境的额外成本,顶层环境的组件都直接复用了各个模块验证环境,顶层环境在集成模块验证环境时,需要将各个子模块中的agent配置为不同模式(active或者passive),以此适应顶层场景,所以不需要实现新的scoreboard,而是可以复用原有模块验证环境的scoreboard

在这里插入图片描述

方案一和方案二相同的地方在于,顶层都需要新建virtual sequencersequence,用来生成顶层的测试序列。而virtual sequencer也不是从零创建的,它本身也是利用原有模块环境的序列库,进行了有机的组合,最后协调生成了新的测试序列。从方案二可以看出,mcdf_env的子组件不再是uvm_agent类,而是各个模块的验证环境uvm_env类。通过直接复用这些子环境,也间接复用了它们内部的scoreboard,在build阶段,需要将各个子环境中不需要再产生激励的agent,配置为passive模式,而默认情况下这些agent均为active模式。这种复用方式使得我们无需再新建一个MCDF scoreboard,只需要确保MCDF的各个子模块都有scoreboard会检查功能,这样从整体上便可以覆盖完整的数据通路。

代码实现

class mcdf_env1 extends uvm_env;
	`uvm_component_utils(mcdf_env1)
	reg_env reg_e;
	chnl_env chnl_e1;
	chnl_env chnl_e2;
	chnl_env chnl_e3;
	fmt_env fmt_e;
	arb_env arb_e;
	mcdf_virtual_sequencer virt_sqr;
	
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		//将子环境配置为active或者passive模式
		uvm_config_db#(int)::set(this, "reg_e.slave", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e1.slave", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e1.reg_cfg", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e2.slave", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e2.reg_cfg", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e3.slave", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "chnl_e3.reg_cfg", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "arb_e.master1", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "arb_e.master2", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "arb_e.master3", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "arb_e.slave", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "arb_e.reg_cfg", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "fmt_e.master", "is_active", UVM_PASSIVE);
		uvm_config_db#(int)::set(this, "fmt_e.reg_cfg", "is_active", UVM_PASSIVE);
		
		//创建子环境
		reg_e = reg_env::type_id::create("reg_e", this);
		chnl_e1 = chnl_env::type_id::create("chnl_e1", this);
		chnl_e2 = chnl_env::type_id::create("chnl_e2", this);
		chnl_e3 = chnl_env::type_id::create("chnl_e3", this);
		virt_sqr = mcdf_virtual_sequencer::type_id::create("virt_sqr", this);
	endfunction
	
	function void connect_phase(uvm_phase phase);
		super.connect_phase(phase);
		//virtual sequencer connection
		virt_sqr.reg_sqr = reg_e.master.sequencer;
		virt_sqr.chnl_sqr1 = chnl_e1.master.sequencer;
		virt_sqr.chnl_sqr2 = chnl_e2.master.sequencer;
		virt_sqr.chnl_sqr3 = chnl_e3.master.sequencer;
		virt_sqr.fmt_sqr = fmt_e.slave.sequencer;
	endfunction
endclass

八、总结

从上面框图和代码中可以看出,UVM带来的环境复用,相比于之前SV验证环境具备了以下几个优势:

  • 各个模块的验证环境是独立封装的,对外不需要保留数据端口,因此便于环境的进一步集成复用。
  • 由于UVM自身的phase机制,在顶层协调各个子环境时,无需考虑由于子环境之间的例化顺序而导致的对象句柄引用悬空的问题。
  • 由于子环境的测试序列是相对独立的,这使得顶层在复用子环境测试序列而构成virtual sequence时,不需要其它额外的迁移成本。
  • UVM提供的config_db配置方式,使得整体环境的结构和运行模式都可以从树状的config对象中获取,这也使得顶层环境可以在不同uvm_test进行集中管理配置。
  • 25
    点赞
  • 274
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 路科验证v2 mcdf代码是用于验证MCDF(多配置自洽场)方法在路科库中的实现的一种代码。MCDF方法是一种计算分子的电子结构和能量的量子化学方法,它将电子排布在一组给定的分子轨道上,并利用自洽场方法来优化这些轨道和分子的电子能量。MCDF方法在化学计算中被广泛应用,用于预测分子的光谱性质、反应能垒等。 在路科验证v2 mcdf代码中,主要包括以下几个步骤: 1. 初始化:代码首先需要初始化所需的参数,例如分子结构、基组选择等。 2. 核心计算:接下来,代码会使用MCDF方法计算分子的电子结构和能量。这包括求解含时无关Hartree-Fock方程、计算分子的电子密度等。 3. 自洽场迭代:在MCDF方法中,自洽场迭代是一个重要的步骤。代码会通过调整分子轨道和电子密度来达到自洽场的要求,直到达到收敛条件(例如轨道能量变化很小)为止。 4. 结果输出:最后,代码将会输出计算得到的分子的能量、电子结构和其他相关的物理量。这些结果可以用于进一步的分析和研究。 总之,路科验证v2 mcdf代码是用于验证MCDF方法在路科库中的实现的一种代码,通过计算分子的电子结构和能量,为进一步的量子化学计算提供基础。 ### 回答2: 路科验证v2 MCDF代码是一种用于验证机器学习模型性能的工具。MCDF(模型复杂度和数据难度)是一种评估机器学习模型性能的指标,可以帮助我们了解模型的泛化能力以及在不同数据难度下的表现。 路科验证v2 MCDF代码包括几个步骤: 1. 数据准备:首先,需要准备数据集来进行模型验证。可以选择一个已有的数据集,也可以根据需求自己生成一个数据集。数据集的特征和标签应该是清晰明确的,且特征和标签的数量应该是一样的。 2. 模型选择:根据需求选择适合的机器学习模型,例如决策树、支持向量机等。根据选择的模型,确定需要调整的参数。 3. 路科验证:路科验证是一种交叉验证的方法,在训练和验证的过程中,将数据集划分为K个相等大小的折(或区间),其中K-1个折用于训练,剩下的1个折用于验证。该过程会进行K次,每次会选择不同的验证折。通过路科验证可以获得模型在不同数据子集上的表现情况。 4. MCDF计算:MCDF是根据不同的数据难度和模型复杂度计算的。数据难度可以通过调整不同的训练和验证集合比例来获得。模型复杂度则是根据选择的机器学习模型和调整的参数来得到。MCDF计算可以通过统计模型在不同数据子集上的准确率、精确率、召回率等指标来得到。 通过路科验证v2 MCDF代码,我们可以了解到机器学习模型在不同数据子集上的表现,评估模型的泛化能力,了解模型的优势和不足,并根据结果进一步调整模型和参数,提高模型的性能。 ### 回答3: 为了回答你的问题,我首先需要解释一下相关的背景信息。路科验证 (Lucas-Lehmer test) 是一种用于验证 Mersenne 数的质数性质的算法,而 v2 mcdf 代码则是实现了这种验证方法的计算机程序。 路科验证基于费马小定理和二次剩余定理,用于判断形如 2^n - 1 的数是否为质数。具体的算法如下: 1. 初始化:选择一个整数 n,通常要求 n 是质数,并且计算 s = 4 - 2^(n-1)。 2. 迭代计算:对于 i 从 2 到 n-1,重复以下步骤: a. 计算 s = (s^2 - 2) mod (2^n - 1)。 3. 结果验证:若 s 等于零,则 2^n - 1 是一个 Mersenne 质数。 v2 mcdf 代码是一种对路科验证算法的实现,用于在计算机上自动执行验证计算。这个代码可能是一种特定的程序或者函数,其输入为一个数字 n,通过计算得出验证结果。 使用 v2 mcdf 代码进行路科验证的步骤如下: 1. 根据你的需求选择一个合适的 n 值。 2. 利用 v2 mcdf 代码进行验证计算,输入 n,并获得验证结果。 3. 如果验证结果为真,则 2^n - 1 是一个 Mersenne 质数;如果验证结果为假,则不是。 需要注意的是,路科验证算法是一种可以在合理的时间内进行的算法,但对于非常大的 n 值,计算可能会非常耗时。因此,考虑到计算资源和时间限制,选择合适的 n 值进行验证是非常重要的。 希望这个回答能够帮助你了解路科验证和 v2 mcdf 代码的基本原理和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值