英伟达深度学习加速器开源项目nvdla(NVIDIA Deep Learning Accelerator)中用到了一个python脚本epython。源代码地址:https://github.com/nvdla/hw/blob/master/tools/bin/epython 。epython全称embeded python utility,简单地说,就是用来预处理verilog文件中嵌入的python脚本。利用python语法的简洁性,来自动生成一些重复的、有规律的代码。
提出问题
我们在写Verilog代码时,状态机的编码一般是由parameter定义,如下:
localparam IDLE = 3'd0;
localparam START = 3'd1;
...
localparam START = 3'd7;
如果中间需要插入一个新状态,就可能要修改两部分。一是位宽可能加1,二是新插入的后面所有的状态都需要加1。
二进制、十进制、十六进制,可以利用Vim或Emacs列编辑、数据填充、格式化来重新编码。如果是格雷码或者独热码就会麻烦很多。
那么有没有一种比较简便的方法呢?
epython的一个应用
我们知道epython可以让verilog中嵌入python脚本,那么我们可以写一个脚本来做这个事情。
假设我们有若干个状态,用python的列表来描述就是:
st = ['IDLE', &#