ARM技术论坛
直播中

五斤麻辣油

9年用户 1350经验值
擅长:电源/新能源
私信 关注
[经验]

使用SpinalHDL状态机生成的Verilog代码如何导入到quartus工程中去呢

Spinal状态机

在使用SpinalHDL的状态机时,生成的Verilog代码里状态机中状态的定义全都是由宏定义来实现的。在真实的工程里,我们很少会讲所有的Verilog代码放在一个文件里。往往是一个模块一个文件。以下面的代码为例:

当采用oneFilePerComponent模式时,那么将会生成两个文件TopLevel.sv及enumdefine.sv。其中enumdefine.sv中将存放状态机中的宏定义:

在SpinalHDL里,工程中所有的宏定义均会放在文件enumdefine.sv中。

Quartus中宏定义

上面的代码没什么问题,但如何导入到quartus工程中去呢?

由于所有的宏定义均放置在了同一个enumdefine.sv文件下,那么能想到的第一个方式是通过将该文件制定为Verilog Header。在Quartus中,可通过下面的tcl指令来设置:

这种方式添加没什么问题,但有问题的是在Quartus里所有引用宏定义的文件都要添加include enumdefine.sv。而很不凑巧的是SpinalHDL生成的TopLevel.sv文件并不会有include。当一个大型工程有大量的状态机模块时最终生成的Verilog文件再一个个手动去添加那就太费体力了。

在Quartus中还有一种添加宏定义的方式是通过下面的tcl语句:

set_global_assignment -name VERILOG_MACRO “SYNTHESIS”
set_global_assignment -name VERILOG_MACRO “fsm_enumDefinition_binary_sequential_fsm_BOOT=2'b00”

通过这种方式添加可以避免再去修改生成的Verilog代码。我们在工程里基于Scala可以很方便的解析enumdefine.sv文件并生成对应的tcl脚本。值得注意的是在tcl里"[]"有特殊含义,需在生成tcl的代码里做字符串义:

set_global_assignment -name VERILOG_MACRO "fsm_enumDefinition_binary_sequential_type=[1:0]"

Vivado宏定义

在Vivado中完全没有上述的问题,将生成的文件直接导入到Vivado中并设置enumdefine.sv为Verilog Header即可。同样,在Vivado中可以通过下面的方式设置宏定义:

Add synthesis option "-verilog_define MACRO_NAME=MACRO_VALUE".

Define the Macros in one file, and set it as "Global Include" by right-clicking the file.

In Project Settings -> Language Options -> Generics/Parameters, you can override parameters but not macros of the design.

原作者:玉骐

更多回帖

发帖
×
20
完善资料,
赚取积分