1.代码规范
1).信号名的长度小于28
2).每行总字符不得超过80个
3).同一个信号使用相同的信号名,无论它在哪一个模块
4).数组表示个体数量采用升序,如:
5).低电平有效的信号,添加_n后缀
6).复位低电平有效(一般认为电平由低到高易产生毛刺)
7).禁止使用_reg后缀(cdc抓取信号时会自动在寄存器信号名称后面添加_reg后缀,若编写代码时在信号名称后面添加_reg后缀会引起重复)
8).由某一信号产生的延迟信号名称使用后缀
9).模块例化名大写,使用U_模块名_补充信息的形式
10).代码缩进,使用空格而不是tab缩进(不同代码编辑器间tab长短不一,当与自己代码编辑器不同的人查看自己的代码时,代码中缩进无规律会带来阅读的不便),一般是四个空格
11).使用英文注释(不同代码编辑器对其他语言如中文编码编码方式不同,当与自己代码编辑器不同的人查看自己的代码时,代码注释会变成乱码而失去意义,也会带来阅读的不便)
12).多bit赋值用下划线隔开
13).禁止在内部模块使用双向端口
14).禁止使用三态门
15).禁止使用initial/task/force/timescale(仿真时会按项目文件中出现的最小的timescale设置进行,因此你要改变该设置需要修改项目文件中所有的timescale)等语句
16).不要在功能模块中改变时钟和复位,诸如帧间清零等的软复位操作应如下:
always @ (posedge clk or negedge rst_n) begin
if (1'b0 == rst_n) begin
/*omitting*/
end
else if (1'b0 == soft_rst_n) begin
/*omitting*/
end
else begin
/*omitting*/
end
end
17).异步信号处理需要使用标准同步模块(诸如Vivado软件开发环境在进行时序分析时,会报告所有的异步信号处理路径,影响关键路径的判断)
18).操作数隔离,在不进行逻辑运算时,保持这些模块的输入不变,并应保证此时不影响程序正常功能
19).保持don't care信号最后的动态值
20).降低开关转换信号的逻辑深度
21).降低信号开关转换频率
2.疑问
2.1FPGA宏
现阶段开发中,FPGA设计正趋向模块化。模块可能在不同设备中有不同互斥的功能、或者在不同的FPGA厂商芯片中要调用不同的IP核,通常采用`define宏定义语句实现条件编译。代码示意如下:
`define xx yy
`ifdef xx
/*omitting*/
`else
/*omitting*/
`endif
2.2综合与不能综合(持续更新)
1).不能综合:
initial。
2).综合:
用可以被综合的语句有:for、fuction和task。
2.3门控时钟与时钟使能
(待更新)
2.4断言
(待更新)