edalize是一个用于接口eda工具的库,主要用于fpga开发。
edalize的Python项目详细描述
这是什么?
所有eda工具,如icarus、yosys、modelsim、vivado、verilator、ghdl、quartus等,都会得到输入hdl文件(verilog和vhdl)和一些特定于工具的文件(约束文件、内存初始化文件、ip描述文件等)。除了这些文件,也许还有几个verilog的定义,还设置了一些顶级参数/泛型或一些特定于工具的选项。配置完成后,将构建一个仿真模型、netlist或fpga图像,在仿真的情况下,还将执行该模型,可能需要一些额外的运行时参数。
问题是,所有这些工具都在以完全不同的方式进行这项工作,而且通常无法将配置从一个模拟器导入到另一个模拟器。
不要害怕!Edalize帮你处理这个。通过告诉edalize您有哪些文件,以及一些信息,在编译和运行时要使用哪些参数化(例如plusargs、defines、generics、parameters)、vpi库源(如果适用)和任何其他尚未提及的特定于工具的选项,它将创建必要的项目文件,并提供为您构建和运行它。
这将使您不必亲自处理与eda工具交互的枯燥工作,同时仍然有足够的能力按照您想要的方式设置项目。
它允许您快速切换工具,至少在模拟器方面是这样。这对于摆脱特定于工具的bug非常有用,或者仅仅是为了让您使用您选择的武器。
它还可以用来获得一个快速模板,如果有,可以在工具的gui中打开,然后继续工作。
它可以直接集成到您现有的Python供电HDL项目的库中,或者可以单独使用(很快)从其他语言编写的项目中提供EDIALID。
如何使用?
好吧,听起来不错。现在,我该怎么开始呢?
假设我们有一个由verilog源文件blinky.v组成的项目,还有一个名为blinky_tb.v的测试平台和一个用于合成的约束文件constraints.sdc。您可以从这里获取这些文件https://github.com/fusesoc/blinky
对于模拟,我们希望使用两个verilog文件,将其构建在一个名为“build”的子目录中,然后使用一个参数运行它来控制模拟的时钟频率。
首先,我们注册要使用的文件:
work_root = 'build' files = [ {'name' : os.path.relpath('blinky.v', work_root), 'file_type' : 'verilogSource'}, {'name' : os.path.relpath('blinky_tb.v', work_root), 'file_type' : 'verilogSource'} ]
然后我们得到一个名为clk_freq_hz的参数,它恰好是一个接受整数的verilog参数:
parameters = {'clk_freq_hz' : {'datatype' : 'int', 'paramtype' : 'vlogparam'}}
让Edalize知道我们打算使用iCarus Verilog进行模拟:
tool = 'icarus'
并将其全部放入一个单独的数据结构中,以及有关项目顶层和名称的一些信息:
edam = { 'files' : files, 'name' : 'blinky_project', 'parameters' : parameters, 'toplevel' : 'blinky_tb' }
现在我们需要从edalize获得一个后端对象:
backend = get_edatool(tool)(edam=edam, work_root=work_root)
创建目录和项目文件:
args = ['--clk_freq_hz=1000'] os.makedirs(work_root) backend.configure(args)
目前,我们还没有运行实际的eda工具,如果愿意的话,可以在不使用edalize的情况下使用work\u根目录中的文件。但让我们继续以edalize为例。
建立仿真模型:
backend.build()
最后用我们的论据运行它。此时,我们可以更改clk_freq_hz的值,而将使用新的值。或者我们可以完全跳过它,使用configure阶段的默认值。:
backend.run(args)
塔达!我们已经模拟过了。作为练习,尝试将tool变量更改为modelsim、xsim或edalize支持的任何其他模拟器,并查看它是否在没有任何更改的情况下工作。
现在是时候创建一个fpga图像了
如您所见,edalize是一个获奖的eda工具接口工具,因此
edalize,不要批评它!edalize,我会做广告的!
有关详细信息,请参见源代码。