toffee基本使用

news/2025/1/9 22:10:11/文章来源:https://www.cnblogs.com/smylog/p/18662986

toffee基本使用

1. 异步环境

toffee 使用了 Python 的协程来完成对异步程序的管理,其在单线程之上建立了一个事件循环,用于管理多个同时运行的协程,协程之间可以相互等待并通过事件循环来进行切换。

1.1 基本关键字

当函数前加上async 关键字时,这个函数就变成了一个协程函数,例如:

async def my_coro():...

当我们在协程函数内部使用 await 关键字时,我们就可以执行一个协程函数,并等待其执行完成并返回结果,例如:

async def my_coro():return "my_coro"async def my_coro2():result = await my_coro()print(result)

如果不需要等待函数完成,使用create_task方法将函数加入后台运行:

import toffeeasync def my_coro():return "my_coro"async def my_coro2():toffee.create_task(my_coro())

在toffee中使用toffee.run启动事件循环,并运行异步程序:

import toffeetoffee.run(my_coro2())

在toffee中需要先启动事件循环,然后才能在事件循环中创建验证环境:

import toffeeasync def start_test():# 创建验证环境env = MyEnv()...toffee.run(start_test())

1.2 时钟管理

在 toffee 中,通过start_clock来创建后台时钟:

import toffeeasync def start_test():dut = MyDUT()toffee.start_clock(dut)toffee.run(start_test())

在其他协程中,我们可以通过 ClockCycles 来等待时钟信号到来,ClockCycles 的参数可以是 DUT,也可以是 DUT 的每一个引脚。例如:

import toffee
from toffee.triggers import *async my_coro(dut):await ClockCycles(dut, 10)print("10 cycles passed")async def start_test():dut = MyDUT()toffee.start_clock(dut)await my_coro(dut)toffee.run(start_test())

每当十个周期,my_coro()就会继续执行,打印文字。更多等待时钟信号的方法见API文档(?还没完善)。

2. Bundle 使用

Bundle用于测试环境与DUT的解耦,一个简单的Bundle定义如下:

from toffee import Bundle, Signalsclass AdderBundle(Bundle):a, b, sum, cin, cout = Signals(5)

它继承toffee中的Bundle类,定义了几个接口。随后可以创建AdderBundle实例,通过x.value来访问信号:

adder_bundle = AdderBundle()adder_bundle.a.value = 1
adder_bundle.b.value = 2
adder_bundle.cin.value = 0
print(adder_bundle.sum.value)
print(adder_bundle.cout.value)

2.1 DUT与Bundle的绑定

如果一个DUT与一个Bundle的接口信号完全相同,可以使用bind方法进行绑定:

adder = DUTAdder()adder_bundle = AdderBundle()
adder_bundle.bind(adder)

同时toffee也提供了一些方法用于两者的绑定

2.1.1 通过字典进行绑定

假设 Bundle 中的接口名称与 DUT 中的接口名称拥有如下对应关系:

a    -> a_in
b    -> b_in
sum  -> sum_out
cin  -> cin_in
cout -> cout_out

在创建Bundle时可以使用from_dict方法传入一个字典,告知Bundle以这种方式绑定DUT引脚:

adder = DUTAdder()
adder_bundle = AdderBundle.from_dict({'a': 'a_in','b': 'b_in','sum': 'sum_out','cin': 'cin_in','cout': 'cout_out'
})
adder_bundle.bind(adder)

2.1.2 通过前缀进行绑定

假设 DUT 中的接口名称与 Bundle 中的接口名称如上所示,实际 DUT 的接口名称比Bundle中的名称多了一个io_,

可以使用from_prefix方法创建Bundle,告知Bundle以前缀的方式完成绑定:

adder = DUTAdder()
adder_bundle = AdderBundle.from_prefix('io_')
adder_bundle.bind(adder)

2.1.3 通过正则表达式进行绑定

有时候DUT 中的接口名称与 Bundle 中的接口名称之间有一些复杂的前缀后缀:

a    -> io_a_in
b    -> io_b_in
sum  -> io_sum_out
cin  -> io_cin_in
cout -> io_cout_out

在这种情况下,我们可以通过传入正则表达式,来告知 Bundle 以正则表达式的方式进行绑定:

adder = DUTAdder()
adder_bundle = AdderBundle.from_regex(r'io_(.*)_.*')
adder_bundle.bind(adder)

2.2 创建子Bundle

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/866777.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python + Appium 自动化操作微信入门(超详细)

Appium是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。Appium是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium,能够为用户提供所有常见…

浅谈STC单片机看门狗的作用和使用成都控制器开发

有的控制器的运行环境是很复杂的,比如可能突然来个电压,突然来个浪涌,周围存在的强电磁场也可能交替对控制器造成冲击,也有可能外部器件出现错误很久不响应,这样就有可能让单片机的程序跑飞,或者进入死循环出不来,那这就完蛋了。怎么办呢? 一个简单的办法就是使用单片机…

【云计算】银行数据中心私有云平台2.0建设(来自真实案例,很有启发性)

【导读】某行数据中心私有云平台一期建设后投入使用。但在使用过程中遇到了诸多实际问题:审批流程不贴合实际情况、自动化程度较低、云平台无法与CMDB联动、裸金属纳管等。本文对问题根源进行了探讨,并分享了通过对资源管理模式、审批流程、资源部署、微服务部署等方面进行优…

markdown学习记录

markdown学习 标题 标题用“#” 字体 这是加粗(两个星号) 这是倾斜(一个星号) 加粗+倾斜(三个星号) 这是删除线 (两个~~) 引用大于号是引用分割线(“---”或“***”) 插入图片 !+[名称]+(URL)超链接 [地址名]+(网址) 我的博客地址 列表 有序用数字,无序用“-”号A…

【实用技巧】【探讨】Java 中比较两个对象的差异

1 前言 大家平时写业务代码的时候,应该能感知到哪些是基础配置数据,哪些是实例数据。比如营销里的活动信息、促销信息就属于配置型数据,基于活动带来的订单参与活动信息属于实例数据。比如一些规则信息、流程信息等类似一种版本的概念。那么版本跟版本之间的差异、以及创建…

主机与虚拟机互ping不通的解决办法

一、主机ping不通虚拟机,但虚拟机可以ping主机 解决办法:二、虚拟机ping不通主机,但主机可以ping虚拟机 解决办法: 这里说的第一点我不知道,我是虚拟机可以ping通百度,之前虚拟机有过相关配置 我这里主要是win11电脑网络连接这里开启防火墙下面简单的说明下Vmware的网络连…

Win32汇编学习笔记09.SEH和反调试

Win32汇编学习笔记09.SEH和反调试-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…

【Windows攻防】Windows注册表 IFEO注入

介绍 IFEO 注入攻击是一种基于注册表的攻击技术,几乎可以保证以登录用户甚至管理员/系统用户的身份执行代码。在任何你可以想象的用例中,如果你想要将你的有效载荷绑定到 Windows 平台上二进制文件的“启动”,IFEO(图像文件执行选项)可能是你最好的选择。这是一种开发人员…

[Java] 计算Java对象大小

序在Java应用程序的性能优化场景中,时常需要考虑Java对象的大小,以便评估后,进一步提出优化方案:占用内存的大小。(比如 本地内存) 对象数据在网络传输中占用的网络带宽 对象数据在存储时占用的磁盘空间 ...概述 对象大小如何计算对象大小包括俩部分的内容,对象头和对象…

并行前缀(Parallel Prefix)加法器

并行前缀(Parallel Prefix)加法器 并行前缀加法器的基本介绍 二进制加法器是目前数字计算单元中的重要模块,基础的加法器架构包括行波进位加法器(Ripple Carry Adder),超前进位加法器(Carry Look-Ahead Adder),进位选择加法器(Carry Select Adder)等。加法器的进位传…

科技风?写实风?教你设置多风格三维地图

概述 三维地图通过高度、深度、立体感等表现形式,能够真实还原地形地貌、城市建筑和空间结构。相比二维地图,它能够更清晰地展示复杂的地理数据,帮助用户快速理解空间关系,如地形起伏、建筑高度等。在实际应用中,我们可以将不同风格的三维地图作为项目的主体元素进行展示,…

【模拟电子技术】03-PN与二极管的特性

【模拟电子技术】03-PN与二极管的特性上节中有提到对PN结施加反向电压时,会使得PN结所形成的势垒增加,阻止多子到另一边。在掺杂浓度比较低的时候,外加电场加强,中间的耗尽层会加长,变成了一个粒子加速器,自由电子进去后不断加速。直到某一电场强度时,粒子加速足够大的时…