首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >厌倦了sv/uvm?来看看用python写验证环境

厌倦了sv/uvm?来看看用python写验证环境

作者头像
ExASIC
发布于 2022-06-21 07:56:42
发布于 2022-06-21 07:56:42
2.3K01
代码可运行
举报
文章被收录于专栏:ExASICExASIC
运行总次数:1
代码可运行

本文介绍了cocotb的安装、python tb文件的写法、用xrun仿真cocotb的脚本等,我们来看看体验如何。

一、准备

  • centos7
  • python3.6+
  • yum install python3-devel
  • pip3 install --upgrade cocotb

二、写RTL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// top.sv
module top
  (
   input wire       clk,
   input wire       rst_n,
   input wire [7:0] din,
   output reg [7:0] dout
   );

  initial begin
    $fsdbDumpfile("top.fsdb");
    $fsdbDumpvars(0, top);
  end
 
  always@(posedge clk, negedge rst_n)
    if(!rst_n)
      dout <= 'd0;
    else
      dout <= din;
  
endmodule // top

三、写tb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# tb.py

import cocotb
from cocotb.triggers import Timer, FallingEdge

async def gen_clk(dut):
    for cycle in range(100):
        dut.clk.value = 0
        await Timer(10, units="ns")
        dut.clk.value = 1
        await Timer(10, units="ns")

async def gen_rst(dut):
    dut.rst_n.value = 0
    await Timer(22, units="ns")
    dut.rst_n.value = 1
    print("Reset Done")

@cocotb.test()
async def tb(dut):

    await cocotb.start(gen_clk(dut))
    await cocotb.start(gen_rst(dut))

    test_data_list = range(0,50, 5)
    for test_data in test_data_list:
        await FallingEdge(dut.clk)
        dut.din.value = test_data
    
    await Timer(100, units="ns")

6~11行:定义了一个时钟,50MHz,100个周期。

13~17行:定义了一个复位信号,低电平有效。复位拉高打印“Reset Done”,方便看log。

19行:用@cocotb.test()装饰器指定了tb的顶层主函数。

22行:异步启动gen_clk

23行:异步启动gen_rst

25~28行:产生了一些测试数据,在时钟下降沿后驱动dut的din。

30行:等待100ns结束仿真

四、写仿真脚本Makefile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SIM ?= xcelium
TOPLEVEL_LANG ?= verilog

VERILOG_SOURCES += ./top.sv
TOPLEVEL = top

MODULE = tb

include $(shell cocotb-config --makefiles)/Makefile.sim

设置默认仿真器为cadence xcellium,RTL语言选verilog,指定RTL顶层模块名字(就是dut的名字),testbench的名字为tb,最后include一个cocotb共用的makefile。

五、仿真和看波形

把top.sv、tb.py、Makefile放同一个目录下,敲linux命令:make。不出意外的话,仿真可以正确编译和仿真,如下图:

由于我们在RTL顶层加入了dump fsdb波形的代码,所以在log里可以看到有波形产生。280ns仿真结束,并显示“tb passed”,并打印出汇总信息。可见log还是很友好的。

用verdi打开fsdb,与预期一致:

用spinal生成了一个计数器

MyHDL,体验一下“用python设计电路”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ExASIC 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
震惊小伙伴的Python单行代码
几年前,函数式编程的复兴正值巅峰,一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地,一系列使用其他语言实现这些单行代码的文章也随之出现,比如 Haskell, Ruby, Groovy, Clojure, Python, C#, F#, CoffeeScript。 每篇文章都令人印象深刻的揭示了这些语言中一些出色优秀的编程特征。编程高手们利用这些技巧提高编程速度、改进软件质量,编程初学者能从这些简洁的预防中学到各种编程语言的真谛。 1、让列表中的每个元素都乘以2 print map(
CDA数据分析师
2018/02/05
8260
文本数据处理的终极指南-[NLP入门]
简介 实现任何程度或者级别的人工智能所必需的最大突破之一就是拥有可以处理文本数据的机器。值得庆幸的是,全世界文本数据的数量在最近几年已经实现指数级增长。这也迫切需要人们从文本数据中挖掘新知识、新观点。
用户1332428
2018/03/30
1.5K0
文本数据处理的终极指南-[NLP入门]
Python学习没有捷径,但可以加速,零基础九天你也可以会编程
在小学生都学Python了,你还不知道怎么开始文中介绍了Python的应用广泛,功能强大,提供了Python的在线学习视频和资料等 (收集资料是我们的最爱)。 学习程序语言不是一件难事,也不是一件简单
生信宝典
2018/02/05
9010
Python学习没有捷径,但可以加速,零基础九天你也可以会编程
几个小例子告诉你, 一行Python代码的奇淫技术
首先你要了解一下Python之禅,一行代码输出“The Zen of Python”:
一墨编程学习
2019/05/10
8790
几个小例子告诉你, 一行Python代码的奇淫技术
Python进阶笔记
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。一般是利用原有的数据结构来生成新的列表。
py3study
2020/01/03
1.2K0
一行Python代码竟可以实现这些可赞的功能
Python一直倡导Beautiful、Explicit、Simple等原则,接下来要介绍的一行Python能实现哪些好玩的功能,可能和Explicit原则相违背。
1480
2019/06/20
6190
一行Python代码竟可以实现这些可赞的功能
利用Python Paramiko开发
    前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连的,即一次执行一个命令或上传与下载一个文件,显然效率是不如直接使用Linux shell下的ssh连接命令来进行连接。其实在将Paramiko的源码解压出来后,里面有一个demo的文件夹,里面有一个demo.py的程序,利用它,我们就可以进行长连接,即像ssh一样连接远程主机:
py3study
2020/01/06
1.1K0
利用Python Paramiko开发
一行Python代码
自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是,主要是可以高效开发吧。
半吊子全栈工匠
2018/08/22
2K0
一行Python代码
python-3_函数_匿名函数_正则_
L=['a','b','c','d'] for (offset,item) in enumerate(L):     print offset,item 打印的结果: 0 a 1 b 2 c 4 d 迭代器: for i in range(100):     生成列表 for i in xrange(100)    迭代器,速度会比range快 readlines()    xreadlines() a=iter(list) 生成迭代器 a.next() 节省内存:只记录迭代的开头和结尾,当前位置。 和函数一起使用,可以使函数中断并保存函数的中断状态,yield,可以减少程序的阻塞 例子: def run():     print "test1"     yield 1                #变成迭代器,程序运行到这里会停止跳到外面的执行。yield相当于返回值。     time.sleep(1)     print "test2"     time.sleep(1)     print "test2"     time.sleep(1)     print "test2"     time.sleep(1) task=run() task.next() print '--do sth else---' task.next()        #如果不加本行,就不会执行yield后面的。 函数: 函数中可以直接修改全局的列表 字典等复杂的数据类型。 lambda函数(匿名函数): def f(x):    return x**2     g = lambda x:x**2  匿名函数的写法 print map(f,range(10))   把列表输入函数运算,再返回结果 print map(lambda x:x**2,range(10)) sorted()用法:例子是对字典key进行排序(虽然字典是无序的) dic1={3:2,4:3,6:9,'a':'test','e':'fff','*':'$'} print sorted(dic1.items(),key=lambda x:x[0]) rgs kargs 内置函数: a=range(10) a=iter(a)    #把列表变成了迭代器 a.next() print [i for i in a if a<5] filter(lambda x:x*x,a)  选出符合的元素 a=[1,2,3,4]  b=[5,6,7,8,9,10] zip(a,b) [(1,5),(2,6),(3,7),(4,8)] map(None,a,b) [(1,5),(2,6),(3,7),(4,8),(none,9),(none,10)] reduce(lambda x,y:x+y,a) 序列化: 硬盘上只能存字符串或者二进制,因此不能存字典,列表等。 pickle 只是python中使用的序列化类型。 pickle.dump(对象,文件句柄)  pickle.load()    pickle.dump(dic1,f) json.dump()  json.load() 正则表达式: m = re.match("\d",匹配的对象)   match是从开头匹配。 查看匹配到字符: m.group()            re.search()全局查找匹配 re.findall() 查找所有匹配到的 re.split()  按照符号分割 re.sub('\d',"|",字符对象)   把梳子全部替换成| re.sub('\d',"|",字符对象,count=2)  只替换前两个 模块的创建和导入: if __name__=='__main__'   主动执行会执行,导入不执行 常用模块: Import sys Sys.path Sys.path Sys.exit Import os os.system('uname') Os.mkdir('myDir') Os.chdir('~')
py3study
2020/01/11
3730
一行 Python 代码能实现什么好玩的功能
手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。
double
2019/07/30
1.1K0
一行 Python 代码能实现什么好玩的功能
交换一次获得长度为k的排列
排列是指一个长度为 len 的整数数组,数组中包含1到len的每个数,且每个数只出现一次。
代码小李
2025/01/28
910
一行Python代码可以做什么,超出你想象
在编程的世界里,简洁就是力量。Python以其优雅和简洁而著称,让开发者能够用更少的代码做更多的事。但这并不意味着功能上的妥协——Python的强大之处在于它允许在一行代码中执行多个语句,这不仅能提高的编码效率,还能使代码更加紧凑和易于阅读。
木头左
2024/06/23
2670
python练习
myset = set(mylist)  #myset是另外一个列表,里面的内容是mylist里面的无重复 项
py3study
2020/01/09
1.1K0
python 运维常用脚本
path = "D:/UASM64/include/" dirs = os.listdir(path) temp=[];
用户5760343
2019/07/31
3.7K0
python之标准库
在unix系统中,不能只简单将字符串‘~/python’添加到sys.path中,必须使用完整路径。如果你希望将这个操作自动化,可以使用sys.path.expanduser('~/python')
py3study
2020/01/07
8980
python模块paramiko与ssh
  paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。
py3study
2020/01/15
1.6K0
一行 Python 代码实现并行,骚技能!
当我用Python写第一行代码的那一天,我着迷于简单性,流行性及其著名的单行代码。
用户7466307
2021/04/22
1.5K0
Python NLTK 情感分析不正确
一位 Reddit 用户使用 Python 的 NLTK 库来训练一个朴素贝叶斯分类器以研究其他句子的情感,但是无论输入什么句子,分类器总是预测为正面。
用户11021319
2024/07/29
1830
Python NLTK 情感分析不正确
那些神奇的一行 Python 代码
Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Python 代码都可以做些什么。
IT派
2018/07/30
6890
那些神奇的一行 Python 代码
Python 开发代码片段笔记
作者编写的一些代码片段,本版本为残废删减版,没有加入多线程,也没有实现任何有价值的功能,只是一个临时记事本,记录下本人编写代码的一些思路,有价值的完整版就不发出来了,自己组织吧,代码没啥技术含量,毕竟Python这一块没怎么认真研究过,代码也都是随性瞎写的,大佬不要喷我,将就着看吧。
王 瑞
2022/12/28
1.3K0
Python 开发代码片段笔记
相关推荐
震惊小伙伴的Python单行代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验