芯片人的快乐——python+systemverilog用波形祝你新春快乐 |献上祝福语波形生成器|

简介: 芯片人的快乐——python+systemverilog用波形祝你新春快乐 |献上祝福语波形生成器|

使用方式

资源路径:祝福语波形生成器


Or vcs_wave_chinese_characters_gen: 基于VCS仿真环境的汉字波形生成器


下载解压于安装有vcs和verdi的linux虚拟机之中:



在script目录下,打开 hanzi_trans.py,修改祝福语:



好的,回到sim目录,键入make fun,等边编译仿真完成弹出verdi弹窗:



双击左侧的u_in_if0,然后中键把gogogo拖到波形窗(为啥结构这么乱,因为是拿之前的工程改的~):



然后双击gogogo,并把波形缩放到最小:



换点其他的祝福语:




可以说是过年过节走亲访友表个白唠个嗑啥的必备良器!


工作原理

汉字转点阵字

参考并借用了这篇文章中的代码并稍作修改:


Python实现点阵字体读取与转换的方法


在hanzi_trans.py脚本中将汉字转为01代表的点阵字,当然了,初始转成的点阵(以*表示有值)是这样的:



对应的01点阵即:



那么此时如果要把这些点阵字作为电路的信号输入,那么结合信号本身的波形展开顺序,显然应该是这么对应的:



从左到右每一列为一组32bit信号的每一比特,并且最下面为低比特,上面为高比特;再结合verilog的文件读取方式,显然我需要把数据整理为这种形式:



在脑海里我就想这两种排列方式,然后发现,这不就是数组转置么。。。。。


所以在脚本里做一步:

tp_rect_list = numpy.transpose(rect_list)


脚本最终输出为gogogo.cfg文件,就是上面这个转置后的01点阵图;


用例改造

找个用例复制替换一下,然后加这么一段:

task gogogo_case_seq::body();
    integer file;
    file = $fopen("../script/gogogo.cfg","r");
    while(!$feof(file))begin
        bit[31:0] value;
        $fscanf(file, "%b\n", value);
        `uvm_do_with(my_tr, {my_tr.gogogo == local::value;})
    end
  #100;
endtask: body

以二进制的方式读取gogogo.cfg的每一行,赋值给31bit的value,将tr的gogogo变量约束为value的值即可,每处理一行打出来一个transaction到interface中,也就实现了波形效果;


makefile改造

加一个make fun的指令,其实就是make run的固定参数版本,其他参数设置请参看【芯片前端】以vcs编译环境为例做一个适用于芯片前端的极简版Makefile实操教程:

fun: clean
  @../script/hanzi_tran.py
  @$(PRE_PROC)
  @vcs $(CMP_OPTIONS)
  @$(EXEC_SIMV) $(RUN_OPTIONS)
  @verdi -ssf sim_base/wave/gogogo_case_0.fsdb &
clean:
  @-rm -rf $(SIM_PATH)/exec ucli.key csrc vc_hdrs.h novas.conf  novas_dump.log  novas.rc verdiLog


相关文章
|
2月前
|
算法 大数据 Python
Python生成器:优雅而高效的迭代器
Python生成器:优雅而高效的迭代器
|
2月前
|
Python
请解释 Python 中的生成器的工作原理。
【2月更文挑战第20天】【2月更文挑战第58篇】请解释 Python 中的生成器的工作原理。
|
2月前
|
Python
Python如何使用生成器生成更加优雅和高效的代码
Python如何使用生成器生成更加优雅和高效的代码
25 0
|
6天前
|
大数据 Python
python中的推导式、生成器(二)
python中的推导式、生成器(二)
|
6天前
|
索引 Python 容器
python中的推导式、生成器(一)
python中的推导式、生成器(一)
|
17天前
|
缓存 大数据 数据处理
Python迭代器、生成器和装饰器探究
【4月更文挑战第2天】 迭代器是遍历集合元素的对象,实现`__iter__()`和`__next__()`方法。示例中自定义迭代器`MyIterator`用于生成整数序列。 - 生成器简化了迭代器实现,利用`yield`关键词实现状态保存,减少内存占用。示例中的`my_generator`函数即为一个生成器。 - 装饰器用于修改函数行为,如日志记录、性能分析。装饰器`my_decorator`在函数调用前后添加额外代码。
29 0
|
18天前
|
大数据 数据处理 开发者
深入理解Python中的迭代器和生成器
Python中的迭代器和生成器是实现高效循环和处理大型数据集的重要工具。本文将深入探讨迭代器和生成器的概念、原理以及在实际开发中的应用场景,帮助读者更好地理解和利用这些强大的工具。
|
22天前
|
存储 大数据 Python
「Python系列」Python迭代器与生成器
Python迭代器是一个可以记住遍历的位置的对象。迭代器对象必须实现两个方法,`__iter__()` 和 `__next__()`。字符串、列表或元组等数据类型都是可迭代对象,但它们不是迭代器,因为它们没有实现 `__next__()` 方法。
14 0
|
1月前
|
大数据 Python
请解释 Python 中的生成器的工作原理。
Python中的生成器通过`yield`语句实现函数执行的暂停与恢复。调用生成器函数时不立即执行,返回生成器对象。通过迭代该对象逐次获取值,每次遇到`yield`,函数暂停并返回结果,下次迭代时从暂停处继续。生成器按需生成值,节省内存,适合处理大数据。以下是一个简单的生成器示例,生成并打印0到4的数字: ```python def generate_numbers(): for i in range(5): yield i for num in generate_numbers(): print(num) ``` 如有更多问题,欢迎提问!😄
15 6
|
1月前
|
人工智能 机器人 测试技术
【Python】Python迭代器与生成器的区别(详细讲解)
【Python】Python迭代器与生成器的区别(详细讲解)
【Python】Python迭代器与生成器的区别(详细讲解)