军用FPGA软件 Verilog语言的编码准测之三态缓冲器和运算符
语言 :Verilg HDL
EDA工具:ISE、Vivado、Quartus II
-
-
- [军用FPGA软件 Verilog语言的编码准测之三态缓冲器和运算符](#军用FPGA软件 Verilog语言的编码准测之三态缓冲器和运算符)
-
- 一、引言
- 二、基本编程规范之三态缓冲器
- 三、基本编程规范之运算符
-
- 强制准则1----关系操作符左边与右边的数据位宽必须一致
- 强制准则2----位操作符左边与右边的数据位宽必须一致
- 强制准则3----禁止在算术表达式中同时出现无符号数和有符号数
- 强制准则4----禁止在关系表达式中使用包含"x"或者"z"的值
- [强制准则5---禁止在算术操作时使用包含 "x" 或者"z "的值](#强制准则5---禁止在算术操作时使用包含 “x” 或者“z ”的值)
- 强制准则6--在数值<位宽×进制×数字>表示中,数值位宽必须与数值的实际位宽一致
- 强制准则7--禁止算术运算结果出现位宽溢出
- 建议准则8--避免在向量运算中使用逻辑运算符
- [建议准则9--建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽](#建议准则9--建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽)
- 四、总结
-
-
关键词: 安全子集,Verilog HDL,编码准则 ,三态缓冲器 、运算符
一、引言
本文学习军用可编程逻辑器件软件 Verilog 语言编程安全子集,标准准则分为强制准则和建议准则,强制准则在Verilog编程中应该遵循,建议准则在Verilog编程中可参考执行。本次分享 三态缓冲器和运算符的国军标verilog语言标准准则。
二、基本编程规范之三态缓冲器
强制准则1---禁止组合逻辑电路的输出作为三态缓冲器的使能端
违背示例:
bash
module top( en1,en2,din,dout)
input en1;
input en2;
input din;
output reg dout;
always@(en1,en2,din) begin
if( en1 & en2) //违背
dout<= din ;
else
out1 <= 1'bz;
end
endmodule
强制准则2---禁止使用内部三态
强制准则3---避免将双向端口直接连接输入端口或输出端口
违背示例:
bash
module top( din, dout,data )
input din;
inout data;
output dout;
wire dout ;
wire data
assign data = din; //违背
...
endmodule
三、基本编程规范之运算符
强制准则1----关系操作符左边与右边的数据位宽必须一致
违背示例:
bash
wire[7:0] w_slot_a;
wire[5:0] w_slot_b;
wire[7:0] w_slot_c;
wire[7:0] w_or ;
assign w_or = (w_slot_a <= w_slot_b) ? w_slot_a : w_slot_c ; //违背
遵循示例:
bash
wire[7:0] w_slot_a;
wire[7:0] w_slot_b;
wire[7:0] w_slot_c;
wire[7:0] w_or ;
assign w_or = (w_slot_a <= w_slot_b) ? w_slot_a : w_slot_c ; //遵循
强制准则2----位操作符左边与右边的数据位宽必须一致
违背示例:
bash
wire[7:0] w_slot_a;
wire[5:0] w_slot_b;
wire[7:0] w_or ;
assign w_or = w_slot_a | w_slot_b; //违背
遵循示例:
bash
wire[7:0] w_slot_a;
wire[7:0] w_slot_b;
wire[7:0] w_or ;
assign w_or = w_slot_a | w_slot_b; //遵循
强制准则3----禁止在算术表达式中同时出现无符号数和有符号数
违背示例:
bash
module add(din1,din2, dout1);
input signed[1:0] din1;
input[1:0] din2;
output[2:0] dout;
reg[2:0] dout;
always@(din1 or din2 ) begin
dout = {din1[1],din1} + {1'b0,din2}; //违背
end
endmodule
遵循示例:
bash
module add(din1,din2, dout1);
input [1:0] din1;
input[1:0] din2;
output[2:0] dout;
reg[2:0] dout;
always@(din1 or din2 ) begin
dout = {1'b0,din1} + {1'b0,din2}; //违背
end
endmodule
强制准则4----禁止在关系表达式中使用包含"x"或者"z"的值
违背示例:
bash
if( temp > 2'bzz)
强制准则5---禁止在算术操作时使用包含 "x" 或者"z "的值
违背示例:
bash
reg[1:0] data1 ;
reg[1:0] data2 ;
always@( posedge clk_40m)
if( !rst_n)
data2 <= data1 + 1'bx ; //违背
else
data2 <= data1 ;
强制准则6--在数值<位宽×进制×数字>表示中,数值位宽必须与数值的实际位宽一致
违背示例:
bash
reg[3:0] temp;
always@( posedge clk_40m)
if( !rst_n)
temp<= 2'd10 ; //违背
遵循示例:
bash
reg[3:0] temp;
always@( posedge clk_40m)
if( !rst_n)
temp<= 4'd10 ; //遵循
强制准则7--禁止算术运算结果出现位宽溢出
违背示例:
bash
wire[7:0] temp;
wire[7:0] temp1;
wire[7:0] temp2;
assign temp = temp1 + temp2 ; //违背
遵循示例:
bash
wire[8:0] temp;
wire[7:0] temp1;
wire[7:0] temp2;
assign temp = {1'b0,temp1}+ {1'b0,temp2};
建议准则8--避免在向量运算中使用逻辑运算符
违背示例:
bash
reg[7:0] data1;
reg[7:0] data2;
wire[7:0] out_reg;
assign out_reg= data1 && data2; //违背
建议准则9--建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽
违背示例:
bash
reg[7:0] in11;
reg out1;
always@( in1)
if( in1 == 'b101)//违背
out1 = 'b0;//违背
else
out1 = 'b1 ; //违背
遵循示例:
bash
reg[7:0] in11;
reg out1;
always@( in1)
if( in1 == 3'b101)//遵循
out1 = 1'b0;//遵循
else
out1 = 1'b1 ; //遵循
四、总结
文章详细介绍了军用FPGA软件编程中使用Verilog语言时应遵守的一系列编码规范,特别是针对三态缓冲器和运算符的设计准则。文章中提出的强制准则包括:
基本编程规范之三态缓冲器
强制准则1---禁止组合逻辑电路的输出作为三态缓冲器的使能端
强制准则2---禁止使用内部三态
强制准则3---避免将双向端口直接连接输入端口或输出端口
基本编程规范之运算符
强制准则1----关系操作符左边与右边的数据位宽必须一致
强制准则2----位操作符左边与右边的数据位宽必须一致
强制准则3----禁止在算术表达式中同时出现无符号数和有符号数
强制准则4----禁止在关系表达式中使用包含"x"或者"z"的值
强制准则5---禁止在算术操作时使用包含 "x" 或者"z "的值
强制准则6--在数值<位宽×进制×数字>表示中,数值位宽必须与数值的实际位宽一致
强制准则7--禁止算术运算结果出现位宽溢出
建议准则8--避免在向量运算中使用逻辑运算符
建议准则9--建议为parameter 数据和常数指定进制('d,'b,'h,'c) 和位宽
文章通过具体的代码示例展示了遵循和违反这些准则的不同情况,强调了遵守这些规范对于确保军用FPGA软件的稳定性和可靠性至关重要。