“旧时王谢堂前燕,飞入寻常百姓家“--> Cocotb

常规的验证UVM、形式验证就可以覆盖大部分应用,但是这些主要是集中在SV/SC/C++/verilog语言中进行。在验证中python的应用大部分是script,但python强大的库只用来作为script有点太“掉价”了。在国外有一位大牛干脆将UVM集成到了python中,直接将python作为了验证语言彻底打破了python和sv交互的障碍。试想一下如果算法、设计、验证都是基于python那开发周期明显缩短,特别是对于AI。

  对于cocotb的介绍小编是查看了相关的官网进行了阅读对有verilog/uvm经验的人来说可以很快入门。

参考网站:

https://github.com/pyuvm/pyuvm https://docs.cocotb.org/en/stable/release_notes.html

cocotb几个核心问题:

  • 工作原理:

    图片

  • 协同仿真(Co-simulation):Cocotb的核心在于协同仿真。这意味着它可以与多种仿真器(如VCS、Verilator等)集成,以执行设计代码(如Verilog、VHDL、SystemVerilog)的仿真。Cocotb本身并不执行仿真,而是作为这些仿真器的一个插件或接口,允许Python测试代码与仿真器中的设计代码进行交互。

  • 协程(Coroutine):Cocotb的名字中的“co”代表协程(Coroutine)。协程是一种用户态的轻量级线程,它允许程序在多个任务之间切换,而不会引起线程切换的开销。在Cocotb中,协程被用于编写测试代码,以便在仿真过程中控制和管理测试的执行。

  • 测试框架和测试用例:Cocotb提供了一套基于Python的测试框架,用于构建和管理测试用例。测试框架允许工程师使用Python编写测试代码,以验证设计代码的正确性。测试代码可以包括各种测试场景、输入数据和期望的输出结果。

  • 通信接口:Cocotb通过仿真器提供的各种标准接口与仿真器中的设计代码进行通信。这些接口允许Python测试代码发送激励(如输入信号)到设计代码,并接收设计代码的响应(如输出信号)。通过这种方式,Cocotb可以验证设计代码在不同条件下的行为是否符合预期。

  • 设计重用和随机化测试:Cocotb鼓励设计重用和随机化测试的哲学。通过编写可重用的测试代码和使用随机化测试技术,工程师可以更高效地发现设计中的问题,并提高测试的覆盖率和可靠性。

  • 集成uvm后组件与uvm之间差别

    案例中选取了example下面的TinyALU_reg进行分析

UVM_component 部分:

1. TEST

图片

   @pyuvm.test是python的修饰符,AluTest是扩展于UVM_TEST的class。在build_phase中instance了env,在end_of_elaboration_phase中create了TestAllSeq,并在run_phase中进行了start()。在pyuvm中uvm_component中没有了12个小phase,并使用objection机制控制各phase的进程。在uvm中我们启动sequence一般是defalue_sequence和start(),但是在pyuvm中是使用start()。

图片

  FibnacciTest扩展与AluTest class,在build_phase中可以直接进行factory机制进行override,这一点和UVM意思是一样的,简单来说就是修改了注册。

2. env

图片

  在build_phase和connect_phase进行了create和port/export connect。其中我们这边有regmodel进行了显示预测,平台中集成了adapter/predict,架构上和uvm没有啥区别。 其中,我们可以看到seqr config set 这个是为了方便sequence拿到p_sequencer句柄。

3. scb

图片

scb中主要是两个export拿到数据放到Q中,然后进行check。

4. sequencer

图片

这个就是和uvm里面是一样的,用例相对简单用户可以开发virtual sequencer。

5. agent

图片

一般来说agent 可以放drv/mon/sequncer,is_active确定当前的agent配置成master or slave。

3. drvier

图片

TinyAluBfm是一个interface类型,transcation 包我们也是采用seq_item_port.get_next_item()和seq_item_port.item_done()组合。

3. monitor

图片

数据采集是采用capture_valid信号控制,采集完成以后发送到ap口上。

4. adapter

图片

bus2reg、reg2bus都是标配

5. predictor

图片

 UVM_object 部分:

1. items

图片

这边还没有call back机制调用pre_randomize()和post_randomize(),不过这个我们后期可以加上去可以进行call back. items的数据类型是支持compare、recoder、pack、unpack、copy等数据类型

2.sequence

图片

图片

图片

    在sequence中我们获得sequncer的句柄是使用config get的方式,这个和uvm中是用p_sequencer用法还是有区别的。获得寄存器的方式也是使用config的方式。

   案例中我们可以看到架构是相对简单的,我们可以优化的地方很多,后期我们会使用新的uvm架构来搭建pyuvm作为一个实践项目。

  • 37
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值