0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

cocotb中的基础语法

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-21 09:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

cocotb的出现使得我们能够在做RTL仿真验证时依托Python来进行测试用例的构建,当我们习惯了用Verilog、SystemVerilog来构建测试用例时,切换到cocotb后最直观的方式便是我们能够建立cocotb中的基础语法与SystemVerilog中仿真常用的关键字又一个对应,能够使我们又一个初步的对照。本篇就cocotb中的基础语法与SystemVerilog中的常用语法做一个对照总结。

非阻塞赋值

在使用Systemverilog进行仿真时,对于接口信号,往往建议采用非阻塞赋值进行操作,其符号为“<=”.

在cocotb中,对于信号的赋值,其提供相应的非阻塞赋值方式,其符号也同样为“<=”。

在cocotb的手册里提到:

The syntaxsig<= new_value is a short form of sig.value = new_value. It not only resembles HDL syntax, but also has the same semantics: writes are not applied immediately, but delayed until the next write cycle.

因而我们可以在cocotb中这样来进行非阻塞赋值:

# Get a reference to the "clk" signal and assign a valueclk = dut.clkclk.value = 1
# Direct assignment through the hierarchydut.input_signal <= 12
# Assign a value to a memory deep in the hierarchydut.sub_block.memory.array[4] <= 2

阻塞赋值

针对阻塞赋值(立即生效),cocotb提供了相应的语法:

setimmediatevalue(value)

因而对于阻塞赋值,我们在cocotb中可以这样写:

dut.input_signal.setimmediatevalue(1)

信号值读取

对于信号的读取,我们在SystemVerilog中,可以直接读取信号值,而在cocotb中,其为接口变量提供了value方法属性用于获取信号值。

读取方式:sig.value

返回类型:BinaryValue

Accessing thevalueproperty of a handle object will return aBinaryValueobject. Any unresolved bits are preserved and can be accessed using thebinstrattribute, or a resolved integer value can be accessed using theintegerattribute.

信号的读取我们可以这么来写:

# Read a value back from the DUTcount=dut.counter.valueprint(count.binstr)1X1010# Resolve the value to an integer (X or Z treated as 0)print(count.integer)42# Show number of bits in a valueprint(count.n_bits)6

#Time

在仿真里延迟等待是经常遇到的,在cocotb里,我们通过Timer来实现延迟:

cocotb.triggers.Timer(time_ps,units=None)

Parameters

time_ps (numbers.Real or decimal.Decimal) – The time value. Note that despite the name this is not actually in picoseconds but depends on the units argument.

units (str or None, optional) – One of None, 'fs', 'ps', 'ns', 'us', 'ms', 'sec'. When no units is given (None) the timestep is determined by the simulator.

由于cocotb是基于协程的,而延迟函数的执行的时间长度是依赖于仿真器的,因此Timer延迟的执行需调用await:

await Timer(1, units='ns')

边沿检测

在SystemVerilog中我们常用posedge、negedge来检测上升沿和下降沿,在cocotb里,针对边沿检测,其提供了四个调用:

等待调变

class cocotb.triggers.Edge(*args, **kwargs)

Fires on any value change of signal.

等待上升沿

class cocotb.triggers.RisingEdge(*args, **kwargs)

Fires on the rising edge of signal, on a transition from 0 to 1.

等待下降沿

class cocotb.triggers.FallingEdge(*args, **kwargs)

Fires on the falling edge of signal, on a transition from 1 to 0.

检测等待指定到个数边沿

class cocotb.triggers.ClockCycles(signal,num_cycles,rising=True)

Fires after num_cycles transitions of signal from 0 to 1.

Parameters

signal – The signal to monitor.

num_cycles (int) – The number of cycles to count.

rising (bool, optional) – If True, the default, count rising edges. Otherwise, count falling edges.

我们在使用时,可以这么来写:

#等待信号signalA发生变化await cocotb.triggers.Edge(dut.signalA)#等待signalA从0变为1await cocotb.triggers.RisingEdge(dut.signalA)#等待signalA从1变为0await cocotb.triggers.FallingEdge(dut.signalA)#等待signalA从0变为1三次awaitcocotb.triggers.ClockCycles(dut.signalA,3,true)

fork-join_none

SystemVerilog中的fork-join_none用于发起一个线程但不等待线程的结束,在cocotb中,相应的语法为fork:

cocotb.fork()

Schedule a coroutine to be run concurrently

在写仿真代码时,我们可以这么写:

async def reset_dut(reset_n, duration_ns):    reset_n <= 0    await Timer(duration_ns, units='ns')    reset_n <= 1    reset_n._log.debug("Reset complete")reset_thread = cocotb.fork(reset_dut(reset_n, duration_ns=500))

这里值得注意的是,由于fork是起一个协程,因而resut_dut需添加async声明。

fork-join

与SystemVerilog中相对应的,cocotb等待一个协程的结束同样提供了join方法:

class cocotb.triggers.Join(*args, **kwargs)

Fires when a fork()ed coroutine completes.

The result of blocking on the trigger can be used to get the coroutine result:

使用方式:

async def coro_inner():    await Timer(1, units='ns')    return "Hello world"
task = cocotb.fork(coro_inner())result = await Join(task)assert result == "Hello world"

fork-any

相较于SystemVerilog中的join-any语法,cocotb并无专门的对应语法,但却有相似的方法供调用:

class cocotb.triggers.First(*triggers)

等待第一个协程结束即返回

t1 = Timer(10, units='ps')t2 = Timer(11, units='ps')t_ret = await First(t1, t2)

这里我们通过First等待t1、t2第一个返回的结果后await结束,并将第一个返回的协程的返回结果赋值给t_ret。

event

对于SystemVerilog中的event,在cocotb中同样提供类似的event:

class cocotb.triggers.Event(name=None)

用于两个协程间的同步

方法:

set(data=None):唤醒所有等待该事件的协程

wait(): 等待事件的出发(await),如果事件已经触发,立即返回

clear(): 清楚以触发的事件

is_set():判断事件是否触发

旗语

cocotb中提供了Lock操作用来实现与SystemVerilog中相似的操作,不过Lock不可声明旗语为多个:

class cocotb.triggers.Lock(name=None)

方法:

locked : True if the lock is held.

acquire():Produce a trigger which fires when the lock is acquired.

release(): Release the lock.

mailbox

SystemVerilog中的mailbox主要用于不同进程间的通信,在cocotb中,普通的Python的队列即可实现该功能(协程中无需没有进程间同步问题)。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 语法
    +关注

    关注

    0

    文章

    44

    浏览量

    10498
  • 非阻塞赋值
    +关注

    关注

    0

    文章

    11

    浏览量

    10108

原文标题:cocotb—基础语法对照篇

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    汇编程序段的定义介绍

    指令部分)... MOVAX, 4C00H INT21H CODE ENDS ENDSTART 语法解读: 程序开始的两条指令都是用于装载数据段寄存器DS的。进入程序后,代码段寄存器CS的值
    发表于 11-21 08:19

    堆栈的定义,堆栈的使用方法

    堆栈的定义 堆栈也是用户使用的存储器的一部分,用于存放临时性的数据和一些其他信息。堆栈段的定义语法如下: 堆栈名SEGMENTSTACK (堆栈内容) 堆栈名ENDS 语法解释: 堆栈
    发表于 11-21 06:49

    语法纠错和testbench的自动生成

    在编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程不可避免的会有一些语法的错误
    发表于 10-27 07:07

    如何解决将e203的rtl导入vivado后报语法错误的问题

    主要内容是介绍一下如何解决将e203的rtl导入vivado后,报语法错误的问题。 二、分享内容 如图所示,导入源码后跑仿真,会报语法错误。 这是因为这些文件里面有用system verilog
    发表于 10-24 09:49

    nuclei studio生成的c语言文件是不支持c的语法吗?

    nuclei studio 生成的c语言文件感觉不支持c的语法,因为刚使用这个软件,还请各位大佬帮忙看看
    发表于 10-20 11:02

    程序编译运行正常但是显示语法错误,为什么?

    样例程序:can_sample.c rtconfig.h里启用了#define RT_CAN_USING_HDR 代码从图中这里开始大段标识语法错误: 跳转到宏
    发表于 09-25 06:27

    termux输出Hello termux

    的 Python 语法 Python 脚本文件只需包含纯 Python 代码,无需添加 `python` 命令或 HTML 标签(如 ``)。错误信息的 `python` 导致解释器无法识别
    发表于 08-29 12:16

    鸿蒙开发如何显示Markdown格式语法 -- markdown_hm介绍

    在开发过程,对于内容的展示通常有富文本和Markdown两种,后者更偏向于技术文档、说明书一类的内容展示。但是和富文本不同的是,没有一个原生组件可以用来解析展示Markdown语法的内容,所以
    发表于 06-30 18:47

    harmony OS NEXT-双向数据绑定MVVM以及$$语法糖介绍

    # 鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍 ## 1.1 双向数据绑定概念 在鸿蒙(HarmonyOS)应用开发,双向数据改变(或双向数据绑定)是一种让数据·模型和UI组件之间
    的头像 发表于 04-29 16:52 1117次阅读

    Python在嵌入式系统的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁的语法、丰富的库和快速的开发周期,这使得它在某些嵌入式场景中非常有用,以下是Python在嵌入式系统
    的头像 发表于 03-19 14:10 1198次阅读

    基于鸿蒙原生ArkTS语法开发的图表组件--柱状图

    大家好,我是陈杨。在上一篇文章,我简要介绍了折线图的实现逻辑,并解释了整体图表的绘制规则。根据这些规则,我们还可以绘制更多种类的图表组件。在本期中,我将讲解如何实现柱状图,并引入了一个新的功能
    的头像 发表于 03-16 16:01 826次阅读
    基于鸿蒙原生ArkTS<b class='flag-5'>语法</b>开发的图表组件--柱状图

    在下载的源码进入bsp目录下的一个板子执行menuconfig报错,怎么解决?

    在下载的源码进入bsp目录下的一个板子执行menuconfig报错,如下: Kconfig:3:warning: ignoring unsupported character
    发表于 03-07 06:35

    标准网络时钟系统:数字时代的通用语法

    特效与舞台灯光保持帧级对齐——这些突破物理界限的协作,都依赖着数字世界的基础语法:标准网络时钟系统。 数字世界的巴别塔解药       物联网设备每秒产生2.5亿个带时间戳的数据点,但若缺乏统一标准,就像全球机场使用不同时区:工业机
    的头像 发表于 03-03 10:08 640次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 Verilog :Verilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码更直观,易于
    的头像 发表于 12-17 09:44 2691次阅读

    SSM开发的常见问题及解决方案

    在SSM(Spring + Spring MVC + MyBatis)框架的开发过程,开发者可能会遇到一些常见问题。以下是对这些问题的详细分析以及相应的解决方案: 一、配置文件问题 问题描述
    的头像 发表于 12-17 09:16 1857次阅读