一个接口EDA工具的抽象库

2020-08-04 20:27:42

Edalize是一个Python库,用于与EDA工具交互。它可以为支持的工具创建项目文件,并在批处理或GUI模式(支持的情况下)下运行它们。

所有EDA工具,如Icarus、Yosys、ModelSim、Vivado、Verilator、GHDL、Quartus等都会获得输入HDL文件(Verilog和VHDL)和一些特定于工具的文件(约束文件、内存初始化文件、IP描述文件等)。与这些文件一起设置的可能还有几个Verilog“定义”、一些顶级参数/泛型或一些特定于工具的选项。一旦配置完成,就会构建仿真模型、网表或FPGA映像,在仿真的情况下,也会执行该模型,可能会使用一些额外的运行时参数。

问题是,所有这些工具都是以完全不同的方式来做这件事,而且通常没有办法将配置从一个模拟器导入到另一个模拟器。

别害怕!埃德莱兹会帮你处理这件事的。通过告诉Edalize您拥有哪些文件,以及一些信息,在编译和运行时使用哪些参数化(例如,plusargs、定义、泛型、参数)、VPI库源(如果适用)和任何其他尚未提及的特定于工具的选项,它将创建必要的项目文件,并为您提供构建和运行它。

这将使您不必亲自处理与EDA工具接口的枯燥工作,同时仍然有相当大的能力以您想要的方式设置项目。

它允许您快速切换工具,至少在模拟器方面是这样。这对于消除特定于工具的错误非常有用,或者只是让您使用您选择的武器。

它还可以用来只获取一个快速模板,如果有的话,您可以在工具的GUI中打开该模板,然后从那里继续工作。

它可以直接集成为您现有的Python驱动的HDL项目的库,也可以独立使用(无论如何很快)来为用其他语言编写的项目提供Edalize。

Edalize是一个Python模块。下载后,我们可以使用以下Python命令进行安装:

假设我们有一个项目,其中包含一个名为blinky.v.的Verilog源文件,然后还有一个名为blinky_tb.v的测试台和一个名为constraints.sdc的合成约束文件。您可以从blinky和orpsoc-cores中的vlog_tb_utils.v获取这些文件。

对于模拟,我们希望使用这两个Verilog文件,在名为build的子目录中构建它,然后使用一个参数运行它以控制模拟的时钟频率。

Edalize是一个Python工具,我们可以在Python脚本文件中运行它,也可以直接在Python控制台中运行它。

Work_root=';build';files=[{';name';:os.path.relpath(';blinky.v';,work_root),';file_type';:';verilogSource';},{';name';:os.path.relpath(';blinky_tb.v';,work_root),&#。:';verilogSource';},{';name';:os.path.relpath(';vlog_TB_utils.v';,work_root),';file_type';:';verilogSource';}]。

该设计有一个名为clk_freq_hz的TopLevel Verilog参数,它接受整数。我们将其默认值设置为1000。测试台还可以通过设置一个名为VCD的加号来启用波形转储:

参数={';clk_freq_hz';:{';datatype';:';int';,';default';:1000,';paramtype';:';vlogparam';},';vcd';:{';datatype';:';bool';,';paramtype。:';plusarg';}}。

并将其全部放入单个数据结构中,以及有关项目的顶层和名称的一些信息:

EDAM={';FILES';::';FILES,';NAME';:';BLINKY_PROJECT';,';参数';:参数,';顶层';:';BLINKY_TB';}。

在这一点上,我们仍然没有运行实际的EDA工具,如果愿意的话,可以在没有Edalize的情况下使用WORK_ROOT目录中的文件。但是让我们用Edalize继续这个例子。

最后用我们的论据来运行它。某些类型的参数(例如plusargs)是在运行时定义的,此时我们可以通过将名称和新值传递给run()来更改它们的值。或者我们可以完全跳过它,并使用配置阶段的默认值。让';在启用VCD日志记录的情况下运行:

多田!我们已经模拟了。作为练习,试着只将工具变量更改为Modelsim、xsim或Edalize支持的任何其他模拟器,看看它是否可以在没有任何更改的情况下工作。