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.
原作者:玉骐
|