问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

如何自动生成Verilog代码:六种实用方法详解

创作时间:
作者:
@小白创作中心

如何自动生成Verilog代码:六种实用方法详解

引用
1
来源
1.
https://m.elecfans.com/article/6325005.html

随着硬件设计的复杂度不断提高,手动编写Verilog代码变得越来越繁琐。本文将介绍六种自动生成Verilog代码的方法,帮助硬件工程师提高工作效率。

方法一:Python直接写入文件

最简单的方法是使用Python直接将代码写入文件:

f = open('mytest.v', 'w')
# rtl = ...
f.write(rtl)

这种方法的优点是实现简单,但缺点是Python代码的可维护性较差。

方法二:读取配置文件再生成

这种方法与第一种的主要区别在于,将可配置的信息存储在配置文件(如Excel、JSON、YAML)中,在脚本中读取配置文件后再生成字符串。

这种方法的优点是脚本相对固定,只需要修改配置文件就可以重新生成Verilog代码。但Python脚本还是相对较乱,因为从配置参数到目标Verilog中间需要各种字符串处理,如正则替换,format,进制转换等。当目标Verilog的格式要求一变,Python脚本还是需要重写。

方法三:利用模板语言

现在我们来利用模板语言,比如Jinja2,(https://docs.jinkan.org/docs/jinja2 ),把配置参数与目标Verilog格式拆分开来。

如下图,有两个模板,RTL模板和验证模板,用同一个配置参数经过不同的模板,就可以得到不同的代码。配置参数与模板转换的过程是由模板引擎来实现,不需要我们再重新造轮子。

这种方法的好处是只需要把精力花了编写模板身上,而其它部分都是由现成的库来实现,这样就只需要写很少量的Python代码了。缺点是这种模板语言与Verilog语言本身有比较大的差异,需要稍微学习一下。

方法四:Verilog里内嵌Python

在Verilog代码注释里嵌入几行Python代码,而保持大部分Verilog不动。比如下面的例子:

always@(posedge clk, negedge rst_n)
 if(!rst_n)
 q[7:0] <= 8'b0;
 else begin
// PYTHON_BEGIN
// import random
// data = []
// for i in range(8)
// data.append(random.randint(0, 1))
// for i in range(8):
// print('q[{}]'.format(data[i]))
// PYTHON_END
 end

可见,这串代码的注释中用PYTHON_BEGIN和PYTHON_END括起了一段Python代码。我们需要提取出这段Python,把Python的执行结果替换到原处。

当然为了保证代码可以再次生成,我们不能删除Python源码,而是需要在注释下方生成。重新生成时会先删除PY_VLG_BEGIN和PY_VLG_END之间的Verilog代码。

always@(posedge clk, negedge rst_n)
 if(!rst_n)
 q[7:0] <= 8'b0;
 else begin
// PYTHON_BEGIN
// import random
// data = []
// for i in range(8)
// data.append(random.randint(0, 1))
// for i in range(8):
// print('q[{}] <= {};'.format(i, data[i]))
// PYTHON_END
// PY_VLG_BEGIN
 q[0] <= 0;
q[1] <= 1;
q[2] <= 0;
q[3] <= 0;
q[4] <= 1;
q[5] <= 1;
q[6] <= 1;
q[7] <= 0;
// PY_VLG_END
 end

这个“提取->执行->替换”的脚本具有通用性,编写起来比较简单。不需要频繁修改。

当Verilog里内嵌的Python功能接近,或者有共性时,就可以把这种处理函数写到一个Py库里,用时import进来。

优势:只需要维护一份Verilog文件(不需要额外的Python脚本了),对设计工程师友好。缺点:每个公司都需要建立自己的共用Py库,当库越来越庞大时,新人或者换工作后就需要重新学习或者重新零开始。

方法五:第四种基础上把常用规则提炼,做成开源工具

每个人单独搞一套就会变得不可持续。可以以开源项目的方式,爱好者共同开发和维护,不断迭代,形成行业规范。例如:HDLGen( https://github.com/WilsonChen003/HDLGen )。

但很可能贡献者有限,停止维护,慢慢荒废。

方法六:利用DSL来编写代码

比如SpinalHDL( https://thucgra.github.io/SpinalHDL_Chinese_Doc )、Chisel( https://www.chisel-lang.org )这种基于Scala的硬件开发工具。优点:有规范,行业标准。缺点:创新得太彻底,学习成本非常高,遇到问题很难找到地方咨询。并与现有的Verilog开发流程差异较大,DSL自成一套设计和验证的方法。

总结

每种方法都有其优缺点,选择哪种方法取决于具体的应用场景和团队的技术栈。希望本文能为硬件工程师提供一些参考和启发。

本文原文来自ExASIC,作者陈锋

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号