曾经,一直觉得Xilinx家的Vivado难用,可当转战至Intel家的Quartus,蓦然觉得Vivado真香~
Spinal状态机
在使用SpinalHDL的状态机时,生成的Verilog代码里状态机中状态的定义全都是由宏定义来实现的。在真实的工程里,我们很少会讲所有的Verilog代码放在一个文件里。往往是一个模块一个文件(方式可参照文章《被忽略的两个Tips》)。以下面的代码为例:
当采用oneFilePerComponent模式时,那么将会生成两个文件TopLevel.sv及enumdefine.sv。其中enumdefine.sv中将存放状态机中的宏定义:
`define fsm_enumDefinition_binary_sequential_type [1:0]
`define fsm_enumDefinition_binary_sequential_fsm_BOOT 2'b00
`define fsm_enumDefinition_binary_sequential_fsm_stateA 2'b01
`define fsm_enumDefinition_binary_sequential_fsm_stateB 2'b10
`define fsm_enumDefinition_binary_sequential_fsm_stateC 2'b11
在SpinalHDL里,工程中所有的宏定义均会放在文件enumdefine.sv中。
Quartus中宏定义
上面的代码没什么问题,但如何导入到quartus工程中去呢?
由于所有的宏定义均放置在了同一个enumdefine.sv文件下,那么能想到的第一个方式是通过将该文件制定为Verilog Header。在Quartus中,可通过下面的tcl指令来设置:
set_global_assignment -name VERILOG_INCLUDE_FILE ./enumdefine.sv
set_global_assignment -name SEARCH_PATH ./
这种方式添加没什么问题,但有问题的是在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.
今天的第二栏只为一杯奶茶~
END
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/PICQPdIXLBSlj7iMrR6TMw
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。