cocotb进行verilog的仿真

参考文献:

讲述了cocotb的代码,和verilog语言的对应关系:Limfx-专业的科研工作者内容发布平台

cocotb官网:Welcome to cocotb’s documentation! — cocotb 1.9.0 documentation

cocotb的思想:基于UVM,通用验证方法学Universal Verification Methodology, UVM,参考资料:UVM-什么是UVM方法学_uvm验证方法学-CSDN博客

https://en.wikipedia.org/wiki/Universal_Verification_Methodology

一、cocotb怎么将输入连接到dut,又怎么接收dut中的值

在cocotb的官网介绍中说明了,python(cocotb)给到DUT的输入端输入,然后给到监控输出端的输出。

dut也就是“Device Under Test。

二、一个简单的例子

在cocotb的github官网页面有一个简单例子:https://github.com/cocotb/cocotb?tab=readme-ov-file

参考的解析资料:cocotb使用指南(一)-CSDN博客

三​​​​、这段是什么意思

三、await函数的作用

四、def 和async def的区别

再次基础上,可以想到,def相当于是给定初始的输入和输出,有点线网类型组合逻辑的感觉。

async def就有点时序逻辑,在上升沿做判断。给定新的赋值等等。

五、找到引用库的位置,对照定义

如下,我知道

六、cocotb的        phv_in = BinaryValue(value= 0,n_bits=phv_width, bigEndian=False)

这样给到phv_in值了之后,就可以像verilog一样,但是切片之后要记得用int来给到输入。

        phv_in[ 300 : 289] = int(insert_key_list[i][ 11 :0 ])

七、保存gtkwave拉出来的信号和标记??另外要关闭打开的波形,才能更新新的波形

将波形下来,添加自己需要的波形,然后保存

如图保存为.gtkw文件,可以直接打开

后续如果下载下来新的波形,必须要把原有的波形关掉,然后再覆盖,这样才能保证新的波形能够覆盖旧的波形,要不然覆盖会失败。

如下先关掉了原来打开的波形,然后用新的波形对旧的波形进行覆盖。

覆盖完毕之后,直接用.gtkw文件打开,就可以在保留原有的信号和标志的情况下,查看新的信号,有点modelsim的restart的感觉。

八、phv的输入有问题

不正确的赋值回导致高位出现异常,例如,这里需要按位给,int太大会溢出,直接phv_out= phv_in也会有问题,导致只是用来给值phv_in也会,高位莫名其妙被拉高。

        for j in range(phv_in_width):
            phv_out[j] = int(phv_in[j])

这是一个正常的赋值。

九、

python语法

  装饰器详解

python装饰器(详解)_python 装饰器-CSDN博客

讲解装饰器的视频:【Python 高级特性】装饰器:不修改代码,就能改变函数功能的强大特性_哔哩哔哩_bilibili

什么是装饰器:

参考自:python装饰器(详解)_python 装饰器-CSDN博客
开放封闭原则
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的

装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能

如图定义了一个装饰器,传入一个函数func,接收到的形参是*args和**kwargs,也就是所有的参数照单全吃。加上了一个start_time 和end_time,两个相减,输出函数的执行时间,并且返回输出结果。然后返回return wrapper。

square是一个计算函数平方的函数,定义一个decorated_square(装饰后的square函数)来接收square的执行时间。然后给定参数10,执行就行。

最常用的方式就是给函数带个帽子,等价于上面的形式。

最最后,也就是我们cocotb中的使用形式了

格式化字符串f的使用

f'{f.__name__} is running.' 是一个 f-string,其中 {f.__name__} 是一个表达式,表示函数 f 的名称。

 讲解*args和**kwargs的视频:

*args会接收传入的所有参数

【Python摸鱼读物】*:别只把它当乘号,还能打包和解包_哔哩哔哩_bilibili

**kwargs是两个**,传入的是一个字典,key是变量名称,value是变量对应的值

*可以用来解包这样本来person是一个对象,解包之后,解包成两个餐宿,就能传入greet函数

两个星号**用来解字典的包

导入需要的类和函数

导入类

导入函数

导入的绝对路径和相对路径还没有弄明白????

输入参数有none

说明参数可以不输入,默认是空列表。也可以输入会进行相应的处理

<think>好的,我需要回答用户关于Cocotb的使用指南和官方文档的问题。首先,用户可能希望了解Cocotb的基本概念和安装步骤,以及如何编写测试脚本。根据提供的引用内容,特别是引用[1]、[2]和[5],我可以提取相关的安装命令和测试脚本示例。 接下来,用户可能需要知道如何配置Cocotb项目,比如Makefile的设置,这部分引用[2]提到了测试脚本的结构,引用[5]提到了安装依赖和仿真环境配置。需要将这些信息整合成清晰的步骤。 然后,关于功能覆盖率和随机测试,引用[1]和[2]中的cocotb-coverage扩展库可以介绍,给出代码示例说明CoverPoint的使用。此外,引用[3]提到的cocotbext-axi扩展库也可以作为示例,展示Cocotb的扩展性。 用户可能还会对官方资源感兴趣,需要提供官方文档链接和社区资源,如GitHub仓库和邮件列表。同时,引用[4]和[5]中的仿真工具和项目示例可以补充学习资源部分。 最后,生成相关问题时要围绕Cocotb的安装、测试编写、覆盖率、扩展库和调试技巧展开,确保问题与用户查询的主题紧密相关。确保所有步骤符合系统级指令,正确使用LaTeX格式,并且引用正确标注。</think>### Cocotb 使用指南 #### 1. **Cocotb 简介** Cocotb(Coroutine-based Cosimulation Testbench)是一个基于 Python 的硬件验证框架,支持对 Verilog/VHDL 设计进行功能验证。其核心思想是通过 Python 协程与仿真器交互,简化测试流程[^1]。 #### 2. **安装与环境配置** - **基础安装**: ```bash pip install cocotb ``` 若需扩展功能(如覆盖率分析),可安装 `cocotb-coverage`: ```bash pip install cocotb-coverage ``` - **仿真器支持**:需提前安装 ModelSim、Vivado 或 Icarus Verilog 等工具[^5]。 #### 3. **编写测试脚本** 测试脚本通常以 `test_*.py` 命名,结构如下: ```python import cocotb from cocotb.triggers import Timer @cocotb.test() async def basic_test(dut): """基础测试示例""" dut.input.value = 0 await Timer(1, units="ns") assert dut.output.value == 1, "逻辑输出异常" ``` - **关键组件**: - `@cotb.test()` 装饰器标记测试用例。 - `dut` 表示被测设计(Device Under Test)的接口。 - 使用 `Trigger`(如 `Timer`)控制时序。 #### 4. **覆盖率与随机测试** 通过 `cocotb-coverage` 实现功能覆盖率收集: ```python from cocotb_coverage.coverage import CoverPoint @CoverPoint("input_comb", xf=lambda x: x, bins=[0, 1]) def cover_input(dut): return dut.input.value ``` 覆盖率数据可通过 `coverage_db` 导出分析[^2]。 #### 5. **项目配置** - **Makefile 示例**: ```makefile SIM ?= icarus TOPLEVEL_LANG ?= verilog VERILOG_SOURCES += $(PWD)/dut.v include $(shell cocotb-config --makefiles)/Makefile.sim ``` 运行测试:`make`。 #### 6. **扩展库应用** Cocotb 支持扩展库(如 `cocotbext-axi` 用于 AXI 协议验证): ```python from cocotbext.axi import AxiStreamBus, AxiStreamSource source = AxiStreamSource(AxiStreamBus(dut, "s_axis"), dut.clk, dut.rst) await source.send(data_packet) ``` 此类扩展简化了复杂接口的测试[^3]。 #### 7. **官方资源** - **文档**:[Cocotb 官方文档](https://docs.cocotb.org/) - **GitHub 仓库**:[cocotb/cocotb](https://github.com/cocotb/cocotb) - **社区支持**:邮件列表(cocotb@lists.librecores.org)和 GitHub Issues。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值