军用FPGA软件 Verilog语言的编码准测之复位
语言 :Verilg HDL
EDA工具:ISE、Vivado、Quartus II
- 军用FPGA软件 Verilog语言的编码准测之复位
- 一、引言
- 二、基本编程规范之复位
- 强制准则1----禁止将异步的置位/复位信号连接到非置位/复位端
- 强制准则2----禁止在同一条复位线路中同时使用异步复位和同步复位
- 强制准则3----禁止使用有竞争冒险情况的组合逻辑输出作为复位信号
- 强制准则4----在资源未受限制时,必须使用专用时钟单元驱动内部产生时钟、高扇出控制信号或内部产生复位信号
- 强制准则5----非SRAM 型 FPGA, 必须对寄存器进行上电初始化,赋固定值
- 建议准则6----建议为复位产生电路创建独立的模块
- 建议准则7----避免在异步复位线路中插入逻辑操作运算
- 建议准则8----避免使用内部生成信号作为寄存器的异步复位信号
- 建议准则9----避免同时使用异步置位和异步复位信号
- 建议准则10----建议在同一个 akways 语句中只使用同一个复位信号
- 三、 总结
- 关键词: 安全子集,Verilog HDL,编码准则 , 复位
一、引言
本文学习军用可编程逻辑器件软件 Verilog 语言编程安全子集,标准准则分为强制准则和建议准则,强制准则在Verilog编程中应该遵循,建议准则在Verilog编程中可参考执行。
二、基本编程规范之复位
强制准则1----禁止将异步的置位/复位信号连接到非置位/复位端
强制准则2----禁止在同一条复位线路中同时使用异步复位和同步复位
违背示例:
module test( clk_40m,rst_n,in1,in2,out1, out2)
input clk_40m;
input in1 ;
input in2 ;
input rst_n ;
output reg out1 ;
output reg out2 ;
reg temp1;
always@(posedge clk_40m or negedge rst_n)
if(!rst_n)
out1<= 1'b0;
else
out1 <= in1 ;
always@(posedge clk_40m)
if(!rst_n)
out2<= 0;
else
out2 <= in2 ; //违背1
...
endmodule
遵循示例:
module test( clk_40m,rst_n,in1,in2,out1, out2)
input clk_40m;
input in1 ;
input in2 ;
input rst_n ;
output reg out1 ;
output reg out2 ;
reg temp1;
always@(posedge clk_40m or negedge rst_n)
if(!rst_n)
out1<= 1'b0;
else
out1 <= in1 ;
always@(posedge clk_40m or negedge rst_n)
if(!rst_n)
out2<= 0;
else
out2 <= in2 ; //遵循
...
endmodule
强制准则3----禁止使用有竞争冒险情况的组合逻辑输出作为复位信号
违背示例:
module test( rsta_n,rsth_n,clk_40m, din ,qout )
input rsta_n;
input rsth_n;
input clk_40m;
input din ;
output reg qout ;
wire rst_n;
assign rst_n= rsta_n & rsth_n;
always@(posedge clk_40m or negedge rst_n)
if(!rst_n)
qout <= 1'b0;
else
qout <= din ;
endmodule
强制准则4----在资源未受限制时,必须使用专用时钟单元驱动内部产生时钟、高扇出控制信号或内部产生复位信号
强制准则5----非SRAM 型 FPGA, 必须对寄存器进行上电初始化,赋固定值
建议准则6----建议为复位产生电路创建独立的模块
建议准则7----避免在异步复位线路中插入逻辑操作运算
违背示例:
module test( rst_n,clk_40m, data,sel,qout)
input rst_n;
input sel;
input clk_40m;
input data;
output qout ;
wire rst_n_in;
assign rst_n_in= rst_n & sel; //违背
always@(posedge clk_40m or negedge rst_n_in)
if(!rst_n_in)
qout <= 1'b0;
else
qout <= data;
endmodule
建议准则8----避免使用内部生成信号作为寄存器的异步复位信号
违背示例:
module test( rst_n,clk_40m,in1, data,qout)
input rst_n;
input in1 ;
input clk_40m;
input data;
output reg qout ;
reg regc;
always@(posedge clk_40m or negedge rst_n )
if(!rst_n )
regc <= 1'b0;
else
regc<= in1 ;
always@(posedge clk_40m or negedge regc)
if(!regc)
qout<= 1'b0;
else
qout<= data;
endmodule
建议准则9----避免同时使用异步置位和异步复位信号
违背示例:
module test( rst_n,clk_40m, get,data,sel,qout)
input rst_n;
input sel;
input clk_40m;
input data;
output reg qout ;
always@(posedge clk_40m or negedge rst_n or posedge set ) //违背
if(!rst_n )
qout<= 1'b0;
else if( set )
qout<= 1'b1;
else
qout <= data;
endmodule
遵循示例:
module test( rst_n,clk_40m, get,data,sel,qout)
input rst_n;
input sel;
input clk_40m;
input data;
output reg qout ;
always@(posedge clk_40m or negedge rst_n ) //违背
if(!rst_n )
qout<= 1'b0;
else if( set )
qout<= 1'b1;
else
qout <= data;
endmodule
建议准则10----建议在同一个 akways 语句中只使用同一个复位信号
三、 总结
文章讨论了军用FPGA软件在使用Verilog语言编程时的编码规范,特别关注复位信号的处理。文章列出了一系列关于复位信号处理的强制和建议准则:
强制准则1:禁止将异步的置位/复位信号连接到非置位/复位端。
强制准则2:禁止在同一条复位线路中同时使用异步复位和同步复位。
强制准则3:禁止使用有竞争冒险情况的组合逻辑输出作为复位信号。
强制准则4:在资源未受限制时,必须使用专用时钟单元驱动内部产生时钟、高扇出控制信号或内部产生复位信号。
强制准则5:非SRAM型FPGA必须对寄存器进行上电初始化,赋予固定值。
建议准则6:建议为复位产生电路创建独立的模块。
建议准则7:避免在异步复位线路中插入逻辑操作运算。
建议准则8:避免使用内部生成信号作为寄存器的异步复位信号。
建议准则9:避免同时使用异步置位和异步复位信号。
建议准则10:建议在同一个always语句中只使用同一个复位信号。
通过示例代码展示了违背和遵循这些准则的情况。