使用方式
资源路径:祝福语波形生成器
Or vcs_wave_chinese_characters_gen: 基于VCS仿真环境的汉字波形生成器
下载解压于安装有vcs和verdi的linux虚拟机之中:
在script目录下,打开 hanzi_trans.py,修改祝福语:
好的,回到sim目录,键入make fun,等边编译仿真完成弹出verdi弹窗:
双击左侧的u_in_if0,然后中键把gogogo拖到波形窗(为啥结构这么乱,因为是拿之前的工程改的~):
然后双击gogogo,并把波形缩放到最小:
换点其他的祝福语:
可以说是过年过节走亲访友表个白唠个嗑啥的必备良器!
工作原理
汉字转点阵字
参考并借用了这篇文章中的代码并稍作修改:
在hanzi_trans.py脚本中将汉字转为01代表的点阵字,当然了,初始转成的点阵(以*表示有值)是这样的:
对应的01点阵即:
那么此时如果要把这些点阵字作为电路的信号输入,那么结合信号本身的波形展开顺序,显然应该是这么对应的:
从左到右每一列为一组32bit信号的每一比特,并且最下面为低比特,上面为高比特;再结合verilog的文件读取方式,显然我需要把数据整理为这种形式:
在脑海里我就想这两种排列方式,然后发现,这不就是数组转置么。。。。。
所以在脚本里做一步:
tp_rect_list = numpy.transpose(rect_list)
脚本最终输出为gogogo.cfg文件,就是上面这个转置后的01点阵图;
用例改造
找个用例复制替换一下,然后加这么一段:
1. task gogogo_case_seq::body(); 2. integer file; 3. file = $fopen("../script/gogogo.cfg","r"); 4. while(!$feof(file))begin 5. bit[31:0] value; 6. $fscanf(file, "%b\n", value); 7. `uvm_do_with(my_tr, {my_tr.gogogo == local::value;}) 8. end 9. #100; 10. endtask: body
以二进制的方式读取gogogo.cfg的每一行,赋值给31bit的value,将tr的gogogo变量约束为value的值即可,每处理一行打出来一个transaction到interface中,也就实现了波形效果;
makefile改造
加一个make fun的指令,其实就是make run的固定参数版本,其他参数设置请参看【芯片前端】以vcs编译环境为例做一个适用于芯片前端的极简版Makefile实操教程:
1. fun: clean 2. @../script/hanzi_tran.py 3. @$(PRE_PROC) 4. @vcs $(CMP_OPTIONS) 5. @$(EXEC_SIMV) $(RUN_OPTIONS) 6. @verdi -ssf sim_base/wave/gogogo_case_0.fsdb & 7. 8. clean: 9. @-rm -rf $(SIM_PATH)/exec ucli.key csrc vc_hdrs.h novas.conf novas_dump.log novas.rc verdiLog