GB/T37979-2019

可编程逻辑器件软件VHDL编程安全要求

SaferuleofVHDLforprogrammablelogicdevicesoftware

本文分享国家标准可编程逻辑器件软件VHDL编程安全要求的全文阅读和高清PDF的下载,可编程逻辑器件软件VHDL编程安全要求的编号:GB/T37979-2019。可编程逻辑器件软件VHDL编程安全要求共有40页,发布于2020-03-01
  • 中国标准分类号(CCS)L77
  • 国际标准分类号(ICS)35.080
  • 实施日期2020-03-01
  • 文件格式PDF
  • 文本页数40页
  • 文件大小1.84M

以图片形式预览可编程逻辑器件软件VHDL编程安全要求

可编程逻辑器件软件VHDL编程安全要求


国家标准 GB/T37979一2019 可编程逻辑器件软件VHDL编程 安全要求 SateruleofVHDLforprogrammahlelogiedevieesoftware 2019-08-30发布 2020-03-01实施 国家市场监督管理总局 发布 币国国家标准化管理委员会国家标准
GB/37979一2019 目 次 前言 范围 2 规范性引用文件 3 术语和定义 缩略语 安全细则 5.1例化类 5.2结构设计类 5.3敏感列表类 5.4声明定义类 5.5 命名类 s,运算类 13 .7循环控制类 l6 5.8分支控制类 l6 5.9时钟类 20 5.10复位及初始化类 26 5.1l1状态机类 30 5.12综合/约束类 33 5.13注释类 35 5.14编码格式类 36 参考文献 37
GB/37979一2019 前 言 本标准按照GB/T1.1一2009给出的规则起草 请注意本文件的某些内容可能涉及专利 本文件的发布机构不承担识别这些专利的责任 本标准由全国信息技术标准化技术委员会(SAC/TC28)提出并归口 本标准起草单位:航天科工集团第三研究院第三O四研究所、电子技术标准化研究院、中 核控制系统工程有限公司、中科院国家空间科学中心 本标准主要起草人:李丽华、王黎、杨楠、王栋、朱琳、张国宇、韩旭东、王颖、刁立峰、刘伟、郑金艳、 李文鹏、胡义武、胡勇、郝永乐,赵静、李超、程承,姜晓辉,姚秀娟、高媛、黄勇、张清、张肠肠、刘志凯 梁成华、陈朋、周宁徐轻尘、石璐
GB/37979一2019 可编程逻辑器件软件VHL编程 安全要求 范围 本标准规定了VHDL.用于可编程逻辑器件软件编程安全细则 本标准适用于可编程逻辑器件软件VHDL的编程安全设计、编码、测试及其使用 ASIC数字电路 设计时也可参照使用 规范性引用文件 下列文件对于本文件的应用是必不可少的 凡是注日期的引用文件,仅注日期的版本适用于本文 件 凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件 GB/T1l457一2006信息技术软件工程术语 GB/T33781一2017可编程逻辑器件软件开发通用要求 术语和定义 GB/Tl14572006和GB/T337812017界定的术语和定义适用于本文件 缩略语 下列缩略语适用于本文件 FPGA;现场可编程门阵列(FieldProgrammableGateArray) VHDL;超高速集成电路硬件描述语言(Very-high-speedintegratedcircuitHardwareDescription Language 安全细则 5 5.1例化类 5.1.1端口例化应采取名称映射的方式,避免位置映射 在进行端口例化时,应采取名称映射的方式,避免位置映射,利于提高程序的可读性和可维护性 示例: -遵循示例 --端口例化采取名称映射 reset_filter_inst:reset_ilter portmap(resetin resetin clk =》clk. reset_out=reset_out;
GB/T37979一2019 -违背示例 -端口例化采取位置映射 reset_filter_inst:reset_filter portmap(reset_in,elk,reset_out 5.1.2例化时不应输人端口悬空 在进行例化时,输人端口应有确定的输人关系,不应悬空 示例" -遵循示例 example_entinstexample_ent pormap(a_in=》s_a in=》s_b. sc; e_out entityeXample_entis port a_in:instd_logie; b_in;instd_logic; c_out;outstdL_logie: endexampleent -违背示例 example_entinsteXample_ent open,--例化时输人端口悬空 portmap(a_in in=》s_b. e_out s_e); entityeXample_entis port( a_in:instd_logic; b_in:instd_logic; e_out:outstdlogic); endexample_ent; 5.1.3例化时未使用的输出端口宜采用“open”说明 例化时,如存在不需使用的输出端口,宜采用“open”说明
GB/37979一2019 示例: -遵循示例 ----- example_ent_inst:example_ent portmap(a_in =》s_a, _in=》sb. c_out=》s_e d_out=》open);--未使用的端口采用open说明 entityexample_entis port a_in;instd_logie; b_in:instd_logice; e_out:outstd_logie: d_out;outstdLlogie; endexample_ent; 5.1.4端口例化时不应进行逻辑运算操作 示例: -遵循示例 example_entinst:example_ent portmap(a_in =》sa, b_in=〉s_b e_out=》s_e d_out=》nots_d_n); Sd_n《=notsd entityexample_entis port( a_in;instd_logie; bin;instdLlogie; sdlgie cout;out d_out;outstd_logiec); endexample_ent;
GB/T37979一2019 --违背示例 example_ent_inst:example_ent portmap(a_in s_a b_in=》s_b sc c_out d_out=》 nots_d);--端口例化时进行逻辑非运算 +++, entityexample_entis port( a_in:instd_logie:; b_in:instdLlogic; c-out;outstdL_logie; d_out:outstd_logie); endeXammple_ent; 5.2结构设计类 5.2.1每个模块/单元应至少包含1个输人/输出端口 示例 --违背示例 entityexample_entis port( --没有定义端口 ; endexample_ent; 5.2.2 除双向编口外,输出信号不应直接用于驱动同一个模块内部的逻辑 单向的输出信号不应直接用于驱动同一个模块内部的逻辑,如需使用可采用中间信号的方式进行 处理 示例 -遵循示例 --输出信号反馈驱动同模块内部逻辑 entitytop_entis port( A_in:instd_logie; Bin;instdLlogic: CIk:instd_logie:; A_r_out:outstdlogie; B_out:outstd_logic endtop_ent; architecturebehave_areoftop_entis signalS_A_r
GB/37979一2019 begin -采用中间信号S_A_的方式驱动内部逻辑 B_out《=B_inandS_A_r; process(clk) begin ifclk'eventandclk='1'then A_r_out《=A_in; S_A_r A_in; endif endprocess; endbehave_are; -违背示例 -输出信号反馈驱动同模块内部逻辑 entitytop_entis port( A_in;instd_logie; B_in:instd_logie:; Clk:instdlogice A_r_out:outstd_logie:; B_out;outstd_logice); endtop_ent; architeeturebehave_areoftop_entis begin B_out=B_inandA_r_out; --输出端口A_r_out 直接用于驱动模块内部逻辑B out process(elk begin fellk'eventandclk='1’thenm A_r_out《=A_in; endif endprocess; endbehave_arc; 5.2.3内部信号应避免使用三态逻辑 大部分可编程逻辑器件除端口外内部无三态逻辑资源,内部信号的三态逻辑无法正确实现 示例: --遵循示例 entitytop_entis port( Dout:outstdIogic); signalsinter_data,S_inter_ctrl,sinter_din;std_logic; '1 S_inter_data=S_inter_dinwhenS_inter_etrl= elseS_inter_data;
GB/T37979一2019 --违背示例 entitytop_entis port( Dout;outstd_logie); ++#+ signalS_inter_data.S_inter_etrl.S_inter_din:std_logie; S_inter_data《=S_inter_dinwhenS_inter_ctrl='1'else'Z'; --内部信号s_inter_data不应使用三态门 5.2.4顶层模块宜只进行模块例化. 示例" --遵循示例 entitytop_entis port( reset_in:instd_logie; clk_in:instd_logie; endtop_ent:; architecturebehave_areoftop_entis signalreset,clk:std_logic; componentreset_filter por reset_in:instdL_logie: clk;instd_logie; reset_out;outstdLlogie):; endcomponent; componentGL33 port( PAD:instdlogie:; GL ;outstdlogic); endcomponent:; reset_filter_0:reset_filter portmmap(reset_in=reset_in, cll clk reset_out=reset clk_0;GL33 portmap(pad=》clk_in GL=》clk; endbehave_are:;
GB/37979一2019 --违背示例 ENTITY ENT(); top signals_Dout1_2;std_logie; S_Doutl_2〈=Doutl_outorDout2_out: U0:big_block1portmap(elk=)elk,rst=)rst,D_in=》Din nl_in,Dout=》Doutl_out) U1:big_block2portmap(clk=)clk,rst=》rst,D_in=》Din2_in,Dout=》Dout2_out); U3:big_block3port =)elk,rst=)rst,D_in=》S_Dout1_2,Dout=》Dout3_out); tmucl 在顶层处理的模块例化外,使用了胶连逻辑 end hedhave_ARc 5.2.5设计中不应存在多余代码或不可达分支 程序中的多余代码或不可达分支不利于程序的管理和维护,同时影响语句、分支等的覆盖率 示例 --违背示例 signalS_count:std_logie_veetor(3downto0); signalS_lag;std_logie; processclk,reset_n) begin freset_n 0')themn s _count〈=others=)'0'): '0" S_flag《一 elsifclk'eventandclk ’1'then ifs_count 16then --该分支不可达 S_flag= else S_count《=S_count+l; endif endif endprocess 5.2.6设计中不应产生非预期的锁存器 锁存器是电平触发,易受毛朝干扰,应避免非预期锁存器的产生 示例: -产生锁存器的实现 data_reg《=datawhenenable='1'elsedata_reg; --无锁存器的实现 data_reg=datawhenenable 1’else'0';
GB/T37979一2019 5.2.7设计模块划分应以功能独立性为原则,一个文件宜对应一个设计模块 5.2.8宜按照不同的设计目标进行模块划分 设计模块划分应考虑不同设计目标,区分面积敏感和速度敏感的部分,便于给不同模块进行不同约 束和优化 5.2.9宜将相关的组合逻辑和可以复用的逻辑划分在同一个模块层次中 将相关的组合逻辑和可以复用的逻辑划分在同一模块层次中,有利于综合工具优化时序关键路径 减少面积消耗,提高代码可读性 5.3敏感列表类 应保证进程中的敏感列表完整、正确,避免敏感信号多余或缺失 组合逻辑敏感信号列表一般应包 括所有影响进程输出的信号,时序逻辑敏感信号列表一般仅包括时钟和异步复位信号 示例 -遵循示例 processa,b,enable begin fenable='0'then outl《=a; else outl(=b endif endprocess; -违背示例 -组合逻辑中敏感列表缺少enable信号 processa,b begin '0’then ifenable outl《=a; else outl《=b endif endprocess; -违背示例 process(clk,rsLn,enable)--时序逻辑中敏感列表enable信号多余 begin ifrstL_n='0'then out_reg《='0'; elsifclk'eventandclk '1'then ifenable '0’thenm out_reg《=a; endif endif; endprocess;
GB/37979一2019 5.4声明定义类 5.4.1多位信号,变量定义时应设置位宽 示例" -遵循示例 -信号,变量定义时应设置位宽 signalS_i;st _vector(1downto0); sdheie Si="o1"; 5.4.2避免出现多余的信号 设计中所有的信号应至少被使用过一次,避免出现没有使用的声明对象 示例: --违背示例 entitysig_entis port( rst_n:instd_logie; elk:instdLlogic; cnt_out;outstd_logie_vector(5downto0); endsig_ent; arechiteeturebehave_arcofsig_entis 5downto0); signalS_count:std_logic_vector --程序中未使用.多余信号 signalcnt:std_logie_vector5downto0); begin cnt_out《=S_count(5downto0); processrs_nelk) begin ifrst_n '0’then '0'); S_count《=otherS elsifclk'eventandclk '1'then S_count〈=s_count十l endif endprocess; endbehavearc; 5.4.3条件判断表达式中避免使用“?”“x”“Z”等状态
GB/T37979一2019 示例: -违背示例 entitytop_entis port( D_in:instdLlogie; D_outoutstdlogic; endtop_ent; ..*. signalS_Ctrl_in;std_logie; D_out=D_inwhens_Ctr_in='Z'else'1';--条件表达式中应避免使用"Z"状态 -违背示例 entitytop_entis port( D_in;instd_logic; D_out;outstdlogie); endtop_ent; als.CHLin,sdLoegic-wewr2dowmo7 signal --条件表达式中应避免使用"?"状态 D_out《=D_inwhenS_Ctr_in="l?0"else'1'; ++#+ 5.4.4不应在一个进程中使用多个 control段 event ess语句event 当proce control段存在多个表达式时,会造成不同综合工具的综合差异,不利于代码 的移植 示例 -违背示例 signalS_a,S_b:stdLlogie; signalS_r;std_logie; processsa,S_b begin ifS_a'eventandSa='1'then 1'hen--不应在一个进程中使用多个eemr.coro段 iS_b'eventandS_b一 s_r=S_axors_b endif endif: endprocess; 5.5命名类 5.5.1信号、变量等自定义短标识符的命名不应与关键字重复 10
GB/37979一2019 示例: --违背示例 signalS_a:stdlogie; signallabel:std_logie; --信号命名与关字重复 5.5.2信号,变量、,实体名等不同类型的自定义的短标识符不应采用相同的名称 信号,变量等自定义的短标识符的命名要求如下 5.5.3 a 应只包含字母、数字字符和下划线 应以英文字母开头; b 末字符不应使用下划线; c d)不应连续使用下划线 5.5.4不应使用大小写英文字母区分不同的命名 5.5.5时钟的命名宜与一般的端口名字相区别 时钟的命名宜以elk开始.以时钟频率或时钟用途标识结束,非时钟相关信号名称不宜包含clk 示例: --遵循示例 --时钟的命名宜与一般的端口名字相区别 entityclk_entis port( clk;instdLlogic; rst:instd_logie; dlk_1oM:outstdL_logie clk_gps;outstd_logie); endelk_ent; 命名宜符合下列规则 5.5.6 a 信号名称不宜超过20个字符 变量名称宜以V开始; b 常量名称宜以C开始 c 实体名称宜以_ent结束; d 实体名称约定文件宜是(entity).vhd: 结构体名称宜以_arc结束; 结构文件名称宜是《architecture).vhd g _nack结束, h 包名称宜以 包声明文件名称宜是(package>).vhd 包文件名称宜是package)_body.vhd 配置名称宜以_conf结束; k 配置声明文件名称宜是(configuration).vyhd 部件名称宜以comp开始; m 类型名称宜以T开始; n 11
GB/T37979一2019 子类型名称宜以ST开始; o 函数名称宜以F开始 p 器件名称宜以U开始; Q 块标号名称宜以_block结束; generate标号名称宜以_gen结束; 进程标号名称宜以_proc结束; 初始信号名称宜以P开始; 输人端口名称宜以_in结束; w 输出端口名称宜以_out结束; 输人/出端口名称宜以_inout结束 X 初始化模块标号名称以_init结束; y 2 使能信号名称宜以_en结束,非使能信号名称不宜使用_ en; 低有效信号名称宜使用_n结尾; aa b》经过一个反相器或缓冲器的信号名称宜仅改变信号后级名; 复位端口名称宜使用rst起始命名,非复位信号名称里不宜包含rst cc 跨越多个模块层次的信号应该使用同样的命名. 5.5.7 当一个信号跨越多个模块层次时,在不同的层次使用同样的命名有助于提高程序的可读性和可维 护性 示例 -遵循示例 entityrs422_entis port( elk;instd_logic; rst:instdlogie rx_in;:instd_logic; rx_data_out:outstd_logie_veetor(15downto0); rx_syn_out:outstd_logic; endrs422_ent; * rx_syn_out《=s_rx_synbands_rX_syna; -信号clk、,rst,rx_in,rx_data_out,rx_syn_out跨越多个层次时采用相同的命名 rxb_block rec_ent pormapclk =>clk rst rst rx_in =》rx_in rx_data_ot=》rx_data_out(15downto8) rx_syn_out S_rxsynb); rx_aL_block;ree_ent portmapelk elk, rst rst. rxin =rXin, rx_data_out=》rx_data_out(7downto0) rx_syn_out=》s_rx_syna;
GB/37979一2019 5.6运算类 5.6.1信号应在赋值后使用 信号在使用前应赋值,以保证其使用时具有确定的状态 示例" --违背示例 entityexample_entis port( SEL_in:instdL_logie: DATA_out:outstd_logie) endexample_ent; architeeturebehave_arcofexample_entis signalS_tmp;stdLlogie; begin process(SEL_in,s_tmp begin if(SEL_in '1'then DATA_out=s_tmp, --s_tmp 信号在使用前没有赋值 else DATA_out〈='0'; endif endprocess; endbehavearc; 5.6.2运算符两端信号或参数位宽应相等 运算符两端信号或参数位宽应相等,具体要求如下 赋值语句、比较语句、运算语句左右信号或参数长度应该相等; a b) 在case语句中,case表达式和case条件语句中的信号或参数的长度应该相等 5.6.3常量赋值表达式等号右边应为固定整型值或可计算的固定整型值 设计中所有的常量应具有可计算性,且为固定的整型值,否则被声明或赋值的常量在编译期间无法 参与计算 示例: -遵循示例 -常量赋值表达式可以计算出明确的数值 SignalS:integer; constantCint1;integer;= 1 constantCint2:integer;=Cintl十1; begIn Cintl十Cint2; 13
GB/T37979一2019 5.6.4不应在整数、实数和无符号整数之间使用隐式转换 在整数、实数、,无符号整数任何两种类型之间进行隐式转换,会影响程序的可移植性 示例. -违背示例 ..*. signalul:unsigned(3downto0); signalintl:integerrange0to15; intl《=ul;--将无符号数隐式转化为整数 +++, -遵循示例 ..*. signalul:unsigned(3downto0); signalintl:integerrange0to15; intl to_integer(ul);--使用转换明数进行不同数据类型之间的转换 +++, 5.b.5避免将有符号数和无符号数混用于同一运算式 示例 -违背示例 ned3downto0); signalul,u2:unsigne signalsl:signed(3downto0); * u2《=ul十sl --将有符号数和无符号数混于同一运算式中 5.6.6同一模块中的单向信号不应有多重驱动 采用多个信号驱动同一个信号,容易造成信号的冲突 示例: --违背示例 signalS_net_1l,S_net_2.S_net_3,S_net_4:std_logic; ..*. out=S_ne_landS_net_2; out〈=notS_net_3norS_net_4); -out被多个信号驱动 5.6.7相同的信号源应避免驱动同一个寄存器的多个异步信号端 为在设计中避免竟争情况,应避免使用同一信号驱动一个寄存器的多个异步端口 14
GB/37979一2019 示例: --违背示例 -相同的信号源不应驱动同一个寄存器的多个异步信号端 tes_block:test_ent --rst和set分别为test_block模块的复位端和置位端 portmap(clk =》clk, --使用rsL_c信号驱动复位端 rst =》rst_c, d_in=>d_in --使用rsE_c信号驱动置位端 set =》rst_c d_out=》d_out); 三态节点的使能端和输人端不宜被同一信号源驱动 5.6.8 示例: --违背示例 entityexample_entis port( d_in:instd_logie:; en_in:instdLlogie; clk:instd_logie; rst:instdlogie d_out;outstdLlogic); endexample_ent signals_cetrl;stdLlogie: signalS_tmpl:std_logie; S_ctrl〈=L_inandS_tmpl; d_out〈=S_etrlwhenS_ctrl='1'else'Z'; --输人信号和使能信号被相同的信号源(S_ctr)驱动 5.6.9不宜使用组合逻辑的输出控制三态门 组合逻辑易由于竞争冒险产生毛刺,不宜使用组合逻辑输出作为使能控制三态门 示例" --违背示例 entityexample_entis port a_in;instd_logie; b_in:instdlogic; d_in:instd_logie:; dout:outstd_logie); endexample_ent; signalsc, stdlogie; S_e=a_inxorb_in; d_out〈=d_inwhenSc='0'else'Z'’; -使用组合逻辑的输出控制三态门 5
GB/T37979一2019 5.7循环控制类 5.7.1用于控制循环终止条件的参数应为常量 示例" -遵循示例 * sUM,foriinlto3loop --用于控制循环终止条件的参数为常量 sum=sum十i; SUM: endloop 5.7.2不应在for循环体内修改循环变量 示例: -违背示例 SUM:foriin1to3loop sum=sum十i; --在循环体内修改循环变量 i十l; endloopSUM 5.7.3while语句条件表达式不应为常量 示例 --遵循示例 0 sum whilei《=5loop sum sum十i 1 i十 endloop 5.8分支控制类 5.8.1case语句表达式不应为固定常量 ase语句执行时,根据条件数值选择不同分支执行,如果条件表达式为常量则其余分支多余 示例 --违背示例 entityexample_entis port( A_in,SEL_in:instd_logic; A_out:outstd_logic); endexample_ent; 16
GB/37979一2019 arehitecturebehave_arcofexample_entis constantCTMP;std_logic; onstantCFs_coND;std_logie;='1' begIn process(SELin,A_in)y begin --case语句的条件表达式不应为常量 (CFs._cOND case is whenCTMP=》A_out=A_in; whenothers=》A_out《='X’ endcase; endprocess; endbehave_arc; 5.8.2 语句的分支不应使用变量或者变量表达式 case 示例" --违背示例 caseVa)is when"o1”;Vh=Va when"10”;Vh=Va十l; when"Ve十V”;Vb=l;--使用变量或者变量表达式作为ease语句的分支 endcase 5.8.3case语句除所有条件分支能完全覆盖其表达式或状态机寄存器的所有取值外,应包含一个 whenothers分支 示例: -遵循示例 caseVa&.V& veis when"]100" r(24downto0)=VA十code_r(7downto0& "o00000"). base_addr_r when"000" base_addr_r(24downto0)=VB十code_r(7downto0&."o00000") when"101" base_addr_r(24downto0)〈=VC十code_r(7downto0& "o00000"); when"001" base_addr_r(24downto0=VD十code_r(7downto0& "o00000"); when"o10" & "o0000o") base_addr_r(24downto0=VE十code_r(7downto0 -case语句包含 whenothers分支 whenothers=》baseaddrr(24downto0 baseaddrr(24downto0 endcase; 17
GB/T37979一2019 -遵循示例 typestateissO,sl,s2,s3,s4,s5) signalnstate,cstate;state; #+# processcstate begin nstate sO; casenstateis whens0 ++#+ wensl1 whens2 whens3 whens4 whens5 case语句包含一个whenothers分支 whenothers=》 endcase; endprocess; 5.8.4组合逻辑中i语句应包含else分支 组合逻辑中,if语句如缺少else分支会产生锁存器 示例: -遵循示例 architeeturebehave_arcofexample_entis begin processa,en begin ifen 1'thenm a; se c《= endif:; endproeess; endbehave_are; 18
GB/37979一2019 --违背示例 arehitecturebehave_arcofexample_entis beginm processa,en begin ifen='1'then --i语句缺少else分支 C a endif: endprocess; endbehave_are; 5.8.5不宜在进程中出现空语句 示例 遵循示例 arehitecturebehave_arcofexample_entis begin processa,en begin ifen='1'then c《=a; else 0; endif; endprocess; endbehavearc; -违背示例 architeeturebehave_arcofexample_entis begin proeessa,en begin en=1'then a; ese NULL;--不宜在进程中出现空语句 endif endprocess; endbehave_are; 5.8.6多级ifelse语句应重视优先级顺序对性能的影响 第一级i优先级最高,路径延时也最短 如果存在关键路径的信号,宜结合功能实现将其放在靠 前的if语句内 19
GB/T37979一2019 5.9时钟类 5.9.1时钟信号不应再汇聚 时钟信号再汇聚,即时钟信号经过不同路径后进行组合逻辑处理产生一个信号作为时钟信号,再汇 聚路径易导致时钟路径上发生时序冲突 示例" -违背示例 entityexample_entis port clk:instd_logie; rstn;instdlogic sell:instd_logie:; sel2:instd_logie; din:instd_logie:; dout;outstdlogie); endexample_ent; architecturebehavearcofexampleentis signalclk1;std_logie; signalclk2;:stdlogie; signalclk_sel;stdLlogie: beginn elk1《=sellandclk cllk2=sel2orclk; lk_sel(=dlklandcdlk2;--此处的时钟信号在时钟网络上发生了再汇聚 processrst_n,elk_sel begin '0')then if(rst_n- dout《='0'; elsifelksel'eventandcelksel=1’then dout《=din; endif; endprocess endbehave_are:; 上述代码的电路示意图见图1 aK RcLRo selll cl sel2 rst_n 图1代码电路示意图 20
GB/37979一2019 5.9.2时钟信号不应连接到多路选择器的控制端 示例" --违背示例 entityexample_entis port( clk;instdLlogie; d_in;instd_logice; d_out;outstdL_logie); endexampleent; dLout=dL_inwhenclk='1'else'0';--时钟信号连接到多路选择器的控制端 5.9.3不宜使用组合逻辑产生的时钟 组合逻辑容易产生毛刺,作为时钟控制信号时引起触发器的错误翻转 示例: --违背示例 entityexample_entis port( a_in;instd_logic; b_in;instd_logie; d_in:instd_logiec; d_out:outstdlogic; endexample_ent arehiteeturebehave_areofexample_entis signalclk:instdLlogie; begin clk=a_inandb_in;--组合逻辑产生时钟 processelk) begin ifclk'eventandelk '1’then--使用组合逻辑产生的时钟 d_out《=d_in; endif:; endprocess; endbehave_are; 5.9.4避免使用门控时钟 使用门控时钟易因毛刺引起误触发,产生逻辑错误 21
GB/T37979一2019 示例: -违背示例 entityexample_entis port clk:instd_logic; clk_out;outstd_logic); endexammpleent signals1:std_logie; dlk_out(=elkandsl;--输出时钟由输人时钟、控制信号经与门产生,容易产生毛刺 5.9.5同一进程中应只使用一个时钟 示例 -违背示例 process(elk_1,clk_2)--在一个进程中使用多个时钟 begin i证rising_edge(elk_1)then b endif: frima_-dgeelk-2)then d endif endprocess; 对跨时钟域信号应采取同步处理措施 5.9.6 异步信号未经同步使用,可能产生亚稳态,引起错误 示例 -违背示例 --示例中a_in为外部输人信号与时钟clk异步 entityexample_entis port( aLin:instd_logie;--a_in为外部的异步信号 clk:instd_logic; dLout;outstdLlogie_vector1downto0); endexample_ent arehitecturebehave_areofexaple_entis signalS_cnt:std_logic_vector(1downto0); begin processclk)
GB/37979一2019 begin =1'then ifelk'eventandelk一 if(a_in='1'then--a_in为外部的异步信号,此处未经同步化直接使用 S_cnt《=S_cnt十l; endif; endil; endprocess; dout《=Scnt ---+ endbehave_arc; -遵循示例 entityexample_entis port( a_in:instd_logic; clk:instd_logie; d_out:outstd_logie_vector(1downto0); endexample_ent; arehiteeturebehave_areofexample_entis signalS_cnt:std_logie_veetor(1downto0); signala_regl;std_logier signala_reg2:std_logie; begin processclk)--同步输人信号a_in begin iclk'eventandclk '1’then a_regl=a_in; a_reg2〈=a_regl; endil; endprocess; process(elk) begin ifelk'eventandclk='1'then if(a_reg2 '1'then--使用同步后的信号 S_cent《=s_ent十1: endif; endif:; endprocess; d_out《=S_cnt; endbehave_arc;
GB/T37979一2019 5.9.7全局时钟宜使用全局时钟布线资源 示例 -遵循示例 -本举例是以某公司芯片设计为例 entityexample_entis port( clk_in:instd_logie; endexample_ent; BUFGinst:BUFG portmap(=》clk,--将输人时钟连接至全局时钟网络后再使用 1=》elk_in); 5.9.8不宜使用行波时钟 行波时钟在行波链上各触发器时钟之间会产生较大的时钟偏移,降低系统的实际速度,并且有可能 超出最坏情况下的建立时间保持时间,设计中不宜使用 示例: -违背示例 行波时钟使用电路的违背示例的示意图见图2 ent2 CLK CLK cnt1 cnt0 图2行波时钟使用电路示意图 -使用前级触发器的输出信号作为后级触发器的时钟信号 5.9.9在设计中宜使用较少的时钟域,最好只使用一个时钟域 多时钟域易引起亚稳态、时序分析困难等问题,在设计中宜减少时钟域,最好只使用一个时钟域 5.9.10时钟信号源不宜驱动不同时钟沿触发的寄存器 设计中使用时钟信号的两个变化沿,不利于时序分析,不利于时序同步 24
GB/37979一2019 示例: --违背示例 entitytop_entis port( clk;instd_logie; rs_n;instd_logic; D_in:instd_logic; D_out:outstdlogic) endtop_ent; arehiteeturebehave_areoftop-_entis signalS_Doutl_r,S_Dout_temp_r:std_logie; begin processclk,rst_n) begin irst_n='0”then S_Dout_temp_r( r(=0; elsiclk'eventandclk='1'then---此处使用时钟信号上升沿 S_Dout_temp_r《=D_in; endif endprocess; processclk,rst_n) begin ifrs_n= '0’then D_out=0; elsifclk'eventandclk='0'then---此处使用时钟信号下降沿 D_.out〈=s_Dou_temp_r endif; endprocess; endbehavearc; 5.9.11避免在时钟路径上插人反相器或缓冲器 在时钟路径上插人反相器或缓存器会增加时钟信号的偏移,引起时序错误,并使时序余量变小 示例: --违背示例 entitytop_entis port( clk;instdLlogic; reset:instd_logie; D_in:instdLIogie; D_out:outstd_logic1 endtop_ent architecturebehave_arcoftop_entis
GB/T37979一2019 signalcock_1;:std_Logic clock_1《=notclk;--在时钟路径上使用反相器 NBUF-" _0_inst,INBU pormap(PAD=》clock_1 Y=》clock_2;--在时钟路径上使用缓存器 processreset,clock_2 endprocess; endbehave_are:; 5.10复位及初始化类 5.10.1不应将寄存器的输出反馈到异步复位(置位)端 同一个寄存器的输出信号不应经过组合逻辑后再反馈回异步复位置位)端 示例 -违背示例 U5;(GTECH_F:D2 Portmap(D=》in2_in CP=》elk. CD=》rst, Q=》outl_out); -触发器U5的输出经组合逻辑后又反馈回U5复位端 rst=inl_iANDout1_out; , 5.10.2同一寄存器的复位与置位信号不应来自同一个信号 使用同一个信号作为寄存器的置位与复位信号会导致竞争与冒险,从而导致数据错误 5.10.3异步复位释放时应采用同步释放的方式 在异步复位释放时应采用同步释放的方式,避免异步复位释放时的亚稳态 示例 -违背示例 Processclk,rst_n)--复位信号rst_n与时钟clk为异步关系 begin f(rstn='0')then--rstn释放时寄存器s_test存在亚稳态风险 S_test〈="o0"; 26
GB/37979一2019 -遵循示例 ##+ processelk,rst_n) begin '0')then if(rst_n rsLnsym0(='0' '0'; rst_n_synl一 1'then--对异步复位信号进行同步释放处理 elsifclk'eventandclk rst_nsyn0《= rst__syml=rst_n_syn0; endif: endprocess; processclk,rst_n_synl)--使用可以同步释放的复位信号进行复位 begin iif(rst_n_synl '0'then s_test="00" 5.10.4寄存器复位端口不应悬空 示例: -违背示例 example_en_inst:example_ent portmapclk=》clk outL!=)out_1);--复位端口被悬空 * entityexample_entis port( clk;instd_logie:; rst:instd_logie:; out1;outstd_logic); endexample_ent; * 5.10.5应使用复位/置位操作对寄存器进行初始化 声明初始化方式对某些器件型号,综合工具是无法综合的 对寄存器的初始化不宜采用声明初始 化方式,应使用复位/置位操作初始化 如存在信号无法通过复位/置位操作初始化,且确认使用的器件 可以声明初始化时,可采用声明初始化方式 示例: --违背示例 ##+ signals_test;stdLlogie-vector(1downto0);="I0";--声明初始化可能无法综合 *
GB/T37979一2019 --遵循示例 processclk,rs_n) begin if(rst_n '0')then "10";--使用复位操作对寄存器进行初始化 Stest 5.10.6在同一时刻宜使用同一个复位域对所有模块进行复位 在同一时刻内存在多个复位域可能混淆设计的初始状态,引起信号的冲突 5.10.7宜将系统复位信号设置为全局网络 将系统复位信号设置为全局时钟网络,可以保证复位信号延迟最小,使所有触发器同时进行全局 复位 示例: -遵循示例 ..*. BUFG BUFG;--将复位信号连接至全局时钟网络 _inst portmapO=》g_rst_n, I=》rst_n); elk,_rst_n) --使用经过全局时钟网络后的复位信号 process begin ifg_rst_n='0'then 5.10.8不宜用时钟信号做复位(置位)操作 在同步电路中,不宜将时钟信号作为复位(置位)信号使用 5.10.9同步复位时,外部复位信号宜使用两级级联寄存器同步 同步复位时,为满足复位及复位释放时的时序要求,宜使用与目标寄存器同一时钟域相同时钟沿的 两级级联寄存器同步外部复位信号 示例: -遵循示例 (elk)--复位信号rstL_n在时钟域elk下两级同步 process begin fclk'eventandclk='1’then rst_n_syn0《=rst_n; rst_n_synl=rst_n_syn0; endif endprocess; processclk)--使用同步之后的复位信号进行同步复位 begin ifelk’e eventandelk《='1'thenm i(rstL_n_synl '0'then S_test〈="00" 28
GB/37979一2019 5.10.10同一个复位(置位)信号宜使用唯一的有效电平 在设计中使用复位(置位)信号的两个有效电平,不能保证各模块同时复位(置位) 示例 -遵循示例 使用同一电平复位的示意图见图3 netll netl2 net21 net22 DEEFR2 DFFRI LK CLK rescet 图3使用统一电平复位 -违背示例 使用不同电平复位的示意图见图4 nel net12 net2 nct22 DFFR1 DFFR2 CLK CLK reset 图4使用不同电平复位 5.10.11组合逻辑作为复位信号时应该被同步 组合逻辑作为复位信号时应该被同步,避免组合逻辑产生毛刺导致误复位 示例 -遵循示例 * rstLn(=rsLaandrstLb;--复位信号由组合逻辑产生 processclk) begin fclk'eventandclk='1'then--对复位信号进行同步化处理,消除毛刺 rst_n_syn0《=rst_n; rst_nL_synl〈=rst_n_syn0; endif; endprocess; processclk,rst_n_synl -使用同步处理后的复位信号进行复位 begin if(rst_n_synl '0'’then 29
GB/T37979一2019 5.11状态机类 5.11.1对状态机中的无效状态应进行合理处理 为避免状态机死锁,对于状态机中无效的状态应进行合理的处理 示例" -违背示例 -程序中状态机进人无效状态后置空操作,可能导致状态机死锁 r(1downto0); singalcurent-state-_r,next-state-r;stdlogie_veetor constantCst0:std_logie_veetor(1downto0) "00" ctor(1downto0) "o01" constantCstl;std_logic_vee constantCst2:std_logie_vector(1downto0) "10" constantCst3;std_logice_veetor(1downto0) "11" asecurrent_state_riSs whenCst0 whenCst whenCst2 -当程序的状态机进人无效状态后执行whenothers分支,由于程序 -中未对无效状态进行任何处理,状态机一旦进人无效状态则无法再返回到正常的状 态,导致状态机死锁 whenothers=》null endcase -遵循示例 singalcurrent_state_r,next_state_r:std_logice_vector(1downto0); "00" constantCst0:std_logie_veetor(1downto0 constantCstl:std_logie_vector1downto0) "o1" "10" constantCst2;std_logie-vetor1downto0) constantCst3:std_logie_veector(1downto0 "l1" casecurrent_state_ris whenCst0 whenCstl =" whenCst2 ++#+ -进人无效状态后返回到初始状态 whenothers=》next_state_r《=Cst0; endcase 30
GB/37979一2019 5.11.2应对状态机综合属性进行适当的设置,确保对无效状态的处理综合有效 应对状态机综合属性进行适当的设置,确保状态机综合后包含对无效状态的处理,可通过在综合设 置中通过勾选安全模式或代码中增加综合属性约束等方式进行设置 示例" --遵循示例 --使用Synplify综合工具时,可以在代码中增加综合属性设置 typestateissO,sl,s2,s3,s4,s5); signalnstate,cstate:state; attributesyn_encodingofestate;signalis"safe,gray"; 5.11.3状态机应初始化为合法状态 应使用全局复位信号使状态机初始化为已知的合法状态 示例: -遵循示例 processrstn,clk) begin ifrst_n='0’then eurent_state-_r(=IDLE;--初始化为DLE状态 elsifrising_edge(clkthen endif: endproceSs; 5.11.4宜使用三段式状态机 状态机宜使用三段式描述,使用三段式描述状态机可提高可读性和规范性 示例" --遵循示例 * -第一个进程,同步时序进程,描述次态寄存器迁移到现态寄存器 processrst_n,clk begin frst_n='0'then current_state_r(=IDLE; elsifrising_edge(elk)then current_state_r〈=next_state_r; endif; endprocess; --第二个进程,组合逻辑进程,描述状态转移条件判断 processcurrent_state_r,AD_start, begimn next_state_r=IDLE casecurrent_state_ris whenIDLE
GB/T37979一2019 ifAD_start='1’then next_state_r(=STATE_I, else IDLE next_state_r《= endif whenSTATE1= next_state_r=STATE_2; -++ whenothers= next_state_r《=IDLE; endcase endprocess; -第三个进程,同步时序进程,描述次态寄存器输出 processrst_ncl begin '0’then ifrst_n= AD_CS='1' ADRD='1'; AD_D(ONE《='0'; elsifrising_edge(clk)then casenext_state_ris whenIDLE AD_CS《= AD_RD(='1' AD_DONE〈='0" #*# when.STATE1l AD_C'S='0' endcase; endif endprocess; 5.11.5宜使用枚举类型来声明状态机 示例 --遵循示例 -枚举类型定义状态机 typestate_valuesisIDLE,Conv_Start,Config_Start,write_Parameter); signalstate,next_state:state_values; 5.11.6状态机中的状态数量及编码方式要求 有限状态机中状态的数量过大会产生较复杂的组合逻辑电路,使时序路径上的传输延时增大 a 状态机的数量一般应少于40, 32
GB/37979一2019 b 二进制编码需要的寄存器较少,但对状态机译码时,需要比较多的组合逻辑,在面积重要时,宜 采用二进制编码; 独热编码需要较多的寄存器,但状态机之间需要的组合逻辑资源比较少,能够提高逻辑的速 度,在速度重要时,宜采用独热码编码; d 格雷编码需要较少的寄存器,但形成的组合逻辑比较复杂,格雷码每个相邻的状态的切换只有 个比特的信号跳变,速度较快,在组合逻辑资源较多,且状态跳转顺序确定时,宜采用格雷 编码 示例" --遵循示例 --采用二进制编码 s、ISsO,sl,s2,s3,s4) typestate_values1 SIGNALnstate,cstate:state_values; sequential" atrilbutesyn_encodingofestate,signalis"safe, --遵循示例 --采用独热码编码 typestate_valuesISs0,sl,s2,s3,s4); SIGNALnstate,cstate;state-values attributesyn_encodingofcstate:signalis"safe,onehot"; -遵循示例 --采用格雷码编码 typestate_valuesISsO,sl,s2,s3,s4); SIGNALnstate,cstate:state_vaues; attributesyn_encodingofcstate;signalis"safe,gray" 5.12综合/约束类 5.12.1在用于综合的代码中应避免使用不可综合的代码 示例" --空字符串常量不可综合 eIVHDl_2159.ardhfcvHDL_2159s arehitecture -违背示例 --错误 constantN;string;= -遵循示例 eonstantB:integer;一 正确 begin endDCVHDL -23159_areth 33
GB/T37979一2019 --非整型generic不可综合 -违背示例 entityDCVIHDL_2024is generic(delay;string;="temp");--错误 port( B:instd_logie; 1downto0)); A:outstd_logic_veetor endDCVHHDL_2024; --遵循示例 entityexl75is 正确 genericn;integer;=8);- port A:instdlogiec_vectorn一2downto0); D;instd_logie: C;outstdlogie; B:outstd_logie_vectorn一ldownto0)); endexl75; 5.12.2在进行约束设置时,应避免不同的约束间出现矛盾 顶层时序约束和模块时序约束应保持一致 这些时序约束一般包括;时钟约束、I/0延迟约束、伪 路径约束,多周期路径约束,最大/最小延迟约束等 示例: --违背示例 attributesyn_preserve:boolean: -保护信号curenstate不被优化 attributesyn_preserveofcurrent_state:signalistrue- attributesyn_encodingofcurrent_state:signalis"safe,gray";--状态机安全模式设置 -不同约束之间出现矛盾,导致状态机安全模式设置约束失效 5.12.3应避免使用buffer类型的端口 示例 -违背示例 entityexampleentis port( in_1:instd_logice; bufferstdlogic);--应避免使用buffer类型 outl endexample_ent; 5.12.4应在约束文件中对设计的每个时钟进行定义并添加周期约束 应在约束文件中对设计的每个时钟进行定义,在对时钟进行定义的同时应设置其时钟周期 34
GB/37979一2019 示例: 违背示例 --该示例的约束文件仅对dlk_1进行了定义和周期约束,没有对cdlk_2进行定义和周期约束,工具无法 对elk2时序路径的符合性进行确认 --约束文件 ereate_cock一nameclk_1一period20[get_pinsclk_1] --设计文件 entityelk_entis port( clk_1:instd_logic; clk_2;instd_logie: --- ; endclk_ent; architeeturebehave_arcofeclk_entis processelk_l, begin endprocess; process(clk_2, begin .. endprocess; endbehave_arc; 5.13注释类 5.13.1文件开头宜添加注释 注释应使用英文书写,注释内容包括研制单位、作者创建日期、工程名、模块名、版本号、所属项目、 测试程序名、目标器件、软件工具及版本号、功能简介、模块结构、修改记录等 示例: --遵循示例 lEEEsTD1076一2008VHDL.fleCPU_ToP,hd IeS scription:XX-3CPUTOPcontrol Company:FPGAPanel.XXX Author:mary Projectname:CPU_ctrl ersion:V1.00 Date:2015-2-20 type:actelAPA300 Developmenttools;iberoV9.0 Revisionhistory Revision12015-3-910;:33;59mary Delete"rd_reg”signal Revision22015-4-81l;07;23mary
GB/T37979一2019 Addsynthesizerestrietion:synthesissyn_encoding "safe" Addstatedefaultrestriction Copyright(C)2015,XXXInstitute,Alrightsreserved 5.13.2端口定义的输人输出信号宜添加注释说明,注释宜靠近信号定义 5.13.3内部信号,变量宜添加注释说明,注释宜靠近信号定义 5.14编码格式类 5.14.1宜使用空行进行适当的分隔,具体要求如下 a 代码书写应分节,各节之间宜采用一或多个空行分隔 b)功能集中或相关性较强的变量或信号的声明宜放在一起,用空行或注释分开 5.14.2程序编写时应注意对齐和缩进,具体要求如下 行首用空格键对语句进行对齐和缩进 a) 行尾不宜有多余空格; e 同 一个层次的所有语句左端对齐,不同层次之间的语句宜使用空格键缩进; 嵌套语句宜逐层缩进对齐; d e 端口、信号、变量定义应对齐 D 模块例化时,端口映射应对齐 5.14.3应使用空格进行适当的分隔,具体要求如下 不同变量、变量与符号,变量与括号之间宜保留一个空格 b 赋值符号两边宜保留一个空格 运算符两边宜保留一个空格 e 5.14.4其他要求如下 一行代码字符数不宜超过72个; a 同一行代码中不宜有多个HD1语句 b 调用模块进行端口映射时,一行代码只应映射一个信号, c d 文件的引用应使用相对路径而不是绝对路径 36
GB/37979一2019 参 考文献 [1]IEEEstd1076一2008IEEEVHDL.语言标准参考手册(IEEEStandardVHDLLanguage ReferenceManual

可编程逻辑器件软件VHDL编程安全要求GB/T37979-2019

GB/T37979-2019是由中国国家标准化管理委员会发布的一项标准,其主要目的是针对可编程逻辑器件软件VHDL编程过程中存在的安全风险,制定相关的安全要求和规范,以确保设计出来的系统能够满足安全性的基本要求。

该标准包括以下几个方面:

  • 明确了VHDL编程的基本概念和术语,以及VHDL编程过程中需要注意的安全问题;
  • 规定了VHDL源代码的格式和组织结构,明确了代码注释、命名规范等方面的要求;
  • 制定了VHDL编程过程中的安全要求和规范,包括代码编写、模块设计、代码审查等环节;
  • 明确了VHDL测试和验证的流程和方法,以及测试和验证结果的评估标准。

通过建立可编程逻辑器件软件VHDL编程安全要求,GB/T37979-2019将有助于提高VHDL编程的规范化程度和安全性水平,从而增强系统的安全性和稳定性,保证系统能够正常运行,防止出现安全漏洞。

除此之外,该标准还将对数字电子技术的应用产生积极的推动作用。在当前快速发展的数字化时代,数字电子技术已经深入到各个领域,相关专业人员需要对其进行广泛的应用和研究。如果能够按照GB/T37979-2019的要求进行编程,不仅可以提高系统的安全性和稳定性,还能够为数字电子技术的健康发展作出贡献。

总之,可编程逻辑器件软件VHDL编程安全要求GB/T37979-2019的出台是数字电子技术领域的一件大事,它具有重要的意义和价值。希望相关从业人员能够认真学习和贯彻这一标准,为数字电子技术的进一步发展做出更大的贡献。

可编程逻辑器件软件VHDL编程安全要求的相关资料

    和可编程逻辑器件软件VHDL编程安全要求类似的标准

    中文新闻信息标准体系建设指南
    上一篇 本文分享国家标准中文新闻信息标准体系建设指南的全文阅读和高清PDF的下载,中文新闻信息标准体系建设指南的编号:GB/T37699-2019。中文新闻信息标准体系建设指南共有13页,发布于2019-12-01
    鞋类鞋带试验方法抗松脱性能
    本文分享国家标准鞋类鞋带试验方法抗松脱性能的全文阅读和高清PDF的下载,鞋类鞋带试验方法抗松脱性能的编号:GB/T38013-2019。鞋类鞋带试验方法抗松脱性能共有5页,发布于2020-03-01 下一篇
    相关推荐