0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

代码编写中verilog的设计规范

ZYNQ 来源:ZYNQ 作者:ZYNQ 2022-11-25 09:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


	

5.2 代码编写中容易出现的问题

  • 在for-loop中包括不变的表达式 浪费运算时间
for(i=0;i<4;i=i+1)
begin
Sig1=Sig2;
DataOut[i]=DataIn[i];
end

for-loop中第一条语句始终不变,浪费运算时间.

  • 资源共享问题 条件算子中不存在 资源共享 ,如
z=(cond)?(a+b):(c+d);

必须使用两个加法器; 而等效的条件if-then-else语句则可以资源共享 如

if(Cond)
z=a+b;
else
z=c+d;

只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现。

  • 由于组合逻辑的位置不同而引起过多的触发器综合 如下面两个例子
moduleCOUNT(AndBits,Clk,Rst);
OutputAndbits;
InputClk,
Rst;
RegAndBits;
//internalreg

Reg[2:0]Count;
always@(posedgeClk)begin
begin
if(Rst)
Count<=#u_dly0;
else
Count<= #u_dly Count + 1;
End//endif
AndBits<= #u_dly & Count;
 End //endalways
endmodule

在进程里的变量都综合成触发器了,有4个;

moduleCOUNT(AndBits,Clk,Rst);
OutputAndBits;
InputClk,
Rst;
RegAndBits;
//internalreg
Reg[2:0]Count;
always@(posedgeClk)begin//synchronous
if(Rst)
Count<= #u_dly 0;
else
Count<= #u_dly Count + 1;
End//endalways
always@(Count)begin//asynchronous
AndBits=&Count;
End//endalways
Endmodule//endCOUNT

组合逻辑单开,只有3个触发器.

  • 谨慎使用异步逻辑
moduleCOUNT(Z,Enable,Clk,Rst);
Output[2:0]Z;
InputRst,
Enable,
Clk;

reg[2:0]Z;
always@(posedgeClk)begin
if(Rst)begin
Z<=#u_dly1'b0;
end
elseif(Enable==1'b1)begin
If(Z==3'd7)begin
Z<=#u_dly1'b0;
End
elsebegin
Z<= #u_dly Z + 1'b1;
end
End
Else;
End//endalways
Endmodule//endCOUNT

是同步逻辑,而下例则使用了组合逻辑作时钟,以及异步复位.实际的运用中要加以避免.

moduleCOUNT(Z,Enable,Clk,Rst);
Output[2:0]Z;
InputRst,
Enable,
Clk;
Reg[2:0]Z;
//internalwire
wireGATED_Clk=Clk&Enable;
always@(posedgeGATED_ClkorposedgeRst)begin
if(Rst)begin
Z<=#u_dly1'b0;
end
elsebegin
if(Z==3'd7)begin
Z<=#u_dly1'b0;
end
elsebegin
Z<= #u_dly Z + 1'b1;
end
End//endif
End//endalways
Endmodule//endmodule
  • 对组合逻辑的描述有多种方式 其综合结果是等效的
c=a&b;
等效于
c[3:0]=a[3:0]&b[3:0];
等效于
c[3]=a[3]&b[3];
c[2]=a[2]&b[2];
c[1]=a[1]&b[1];
c[0]=a[0]&b[0];
等效于
for(i=0;i<=3;i=i+1)
c[i]=a[i]&b[i];
可以选择简洁的写法.
  • 考虑综合的执行时间
通常会推荐将模块划分得越小越好, 事实上要从实际的设计目标, 面积和时序要求出发。好的时序规划和合适的约束条件要比电路的大小对综合时间的影响要大。要依照设计的目标来划分模块, 对该模块综合约束的scripts也可以集中在该特性上。要选择合适的约束条件, 过分的约束将导致漫长的综合时间。最好在设计阶段就做好时序规划 。通过综合的约束scripts来满足时序规划。这样就能获得既满足性能的结果 ,又使得综合时间最省 。从代码设计讲 ,500~5000行的长度是合适的。
  • 避免点到点的例外
所谓点到点例外 Point-to-point exception ,就是从一个寄存器的输出到另一个寄存器的输入的路径不能在一个周期内完成。多周期路径就是其典型情况 。多周期路径比较麻烦, 在静态时序分析中要标注为例外, 这样可能会因为人为因素将其他路径错误地标注为例外, 从而对该路径没有分析, 造成隐患。避免使用多周期路径, 如果确实要用 ,应将它放在单独一个模块, 并且在代码中加以注释。
  • 避免伪路径(False path)
伪路径是那些静态时序分析 STA 认为是时序失败, 而设计者认为是正确的路径。通常会人为忽略这些warning ,但如果数量较多时 ,就可能将其他真正的问题错过了。
  • 避免使用Latch
使用Latch必须有所记录, 可以用All_registers -level_sensitive来报告设计中用到的Latch 。不希望使用Latch时 ,应该对所有输入情况都对输出赋值, 或者将条件赋值语 句写全, 如在if语句最后加一个else, case语句加defaults。
  • 当你必须使用Latch时 ,为了提高可测性, 需要加入测试逻辑。
不完整的if和case语句导致不必要的latch的产生, 下面的语句中 DataOut会被综合成锁存器 。如果不希望在电路中使用锁存器, 它就是错误。
always@(Cond)
begin
if(Cond)
DataOut<=DataInend
  • 避免使用门控时钟

使用门控时钟(Gated clock)不利于移植 ,可能引起毛刺, 带来时序问题 ,同时对扫描链的形成带来问题。门控钟在低功耗设计中要用到 ,但通常不要在模块级代码中使用 。可以借助于Power compiler来生成 ,或者在顶层产生。

  • 避免使用内部产生的时钟

在设计中最好使用同步设计。如果要使用内部时钟 ,可以考虑使用多个时钟。因为使用内部时钟的电路要加到扫描链中比较麻烦,降低了可测性, 也不利于使用约束条件来综合。

  • 避免使用内部复位信号

模块中所有的寄存器最好同时复位。如果要使用内部复位, 最好将其相关逻辑放在单独的模块中, 这样可以提高可阅读性。

  • 如果确实要使用内部时钟, 门控时钟 ,或内部的复位信号 ,将它们放在顶层。

将这些信号的产生放在顶层的一个独立模块, 这样所有的子模块分别使用单一的时钟和复位信号。一般情况下内部门控时钟可以用同步置数替代。

6 附录

6.1 Module 编写示例

/**
Filename﹕
Author﹕
Description﹕
Calledby﹕
RevisionHistory﹕mm/dd/yy
Revision1.0
Email﹕M@sz.huawei.com.cn
Company﹕HuaweiTechnology.Inc
Copyright(c)1999,HuaweiTechnologyInc,Allrightreserved
**/
Modulemodule_name(
Output_ports,//comment;portdescription
Input_ports,//comment;portdescription
Io_ports,//comment;portdescripttion
Clk_port,//comment;portdescription
Rst_port//comment;portdescription
);

//portdeclarations
Output[31:;0]Dataout;
Input[31:0]Datain;
InoutBi_dir_signal;
Inputinput1,
Input2;

//interrnalwire/regdeclarations
Wire[31:0]internal_data;
Regoutput_enable;

//moduleinstantiations,Self-buildmodule
Module_name1Uinstance_name1(...);
Module_name2Uinstance_name2(...);

//TSC4000cell
DTC12V1(.Clk(Clk),.CLRZ(Clr),.D(Data),.Q(Qout));

//continuousassignment
AssignData_out=out_enable?Internal_data:32’hz;

//alwaysblock
Always@(input2)
Begin
...
End
//functionandtaskdefinitions
Functiom[function_type]function_name;
Declarations_of_inputs;
[declarations_of_local_variables];
Begin
Behavirol_statement;
Function_name=function_express;
End
Endfunction//endfunction_name
Endmodule//endmodule_name

6.2 testbench编写示例

下面是一个格雷码的测试模块,
moduleTB_GRAY;
regClock;
regReset;
wire[7:0]Qout;
integerfout;//输出文件指针
parameterCYC=20;

GRAYDUT(.Clock(Clock),.Reset(Reset),.Qout(Qout));

initial
begin
Clock=1'b0;
Reset=1'b1;
#(5*CYC)Reset=1'b0;
#(5*CYC)Reset=1'b1;
#(5000*CYC)
$fclose(fout);
$finish;
end

initial
begin
$shm_open("GRAY.shm");
$shm_probe("AS");
fout=$fopen("gray.dat");
end

always#CYCClock=~Clock;


//输出数据到文件gray.dat
always@(posedgeClock)
begin
$fwrite(fout,"%d%b
",Qout,Qout);
end

endmodule
  1. 在testbench中避免使用绝对的时间,如#20,#15或#(CYC+15)等,应该在文件前面使用parameter定义一些常量,使得时间的定义象#(CYC+OFF0)的形式,便于修改。

  2. 观测结果可以输出到波形文件GRAY.shm ,或数据文件gray.dat 。生成波形文件可以用simwave观测结果 ,比较直观。而生成数据文件则既可以快速定位 ,也可以通过编写的小程序工具对它进行进一步的处理。

  3. 对大的设计的顶层仿真 ,一般不要对所有信号跟踪, 波形文件会很大, 仿真时间延长,可以有选择的观测一些信号。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    31

    文章

    1374

    浏览量

    114837
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74546

原文标题:【华为】verilog语言编写规范(三)

文章出处:【微信号:ZYNQ,微信公众号:ZYNQ】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何配置才能让ADL5202正常工作 verilog代码方面要什么要求吗?

    的问题)问题还是我代码的问题,想问问大家ADL5202正常工作时,管脚的电压配置应该是?那些引脚要拉高或者拉低?verilog代码方面要什么要求吗?(我按照手册对其管脚进行了测试,没有发现什么不对的)(有点着急)
    发表于 05-21 08:12

    如何在 LPCXpresso IDE 上编写初始化控制器 PLL 的代码LPC2478?

    如何在 LPCXpresso IDE 上编写初始化控制器 PLL 的代码LPC2478给我一个示例和正确的方法。
    发表于 04-27 08:27

    云台伺服驱动硬件设计规范与实现手册

    对象,从设计规范、电路架构、关键模块实现、PCB 工程规范、可靠性设计、测试验证等方面,形成一套完整、可直接工程化的云台伺服驱动硬件设计手册,适用于航拍、安防跟踪、工业视觉、机载稳定等高精度云台系统。
    的头像 发表于 03-04 15:40 361次阅读

    广电计量参编多项国家标准与计量技术规范发布

    近日,国家市场监督管理总局、国家标准化管理委员会以及工业和信息化部相继发布多项国家标准、行业计量技术规范,其中广电计量参与编写1项国家标准、牵头编写7项行业计量技术规范,涵盖智能装备、
    的头像 发表于 01-13 09:41 908次阅读

    如果将蜂鸟的risc-v移植到其他的fpga想实现一些外设功能有什么办法?可以不用操作系统直接添加verilog代码吗?

    请问如果将蜂鸟的risc-v移植到其他的fpga想实现一些外设功能有什么办法?可以不用操作系统直接添加verilog代码吗?
    发表于 11-10 06:35

    NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件自定义指令反汇编结果分析

    文件,以及对.dasm文件自定义指令反汇编结果分析。 一、如何生成.verilog和.dasm文件文件 项目右键选择Properties 选择C/C++ Build下面的Setting 更改
    发表于 10-24 06:33

    运行自己编写的C语言项目的E203软件仿真环境的搭建

    ,如何让E203能够在软件仿真的环境下运行自己编写的C语言代码呢? 以下是我们的方案。 首先,hbird-sdkapplicationbaremetal目录下放置着一些测试程序,以helloworld
    发表于 10-20 06:44

    TI DMD代码

    最近要开发DLPLCRC410EVM,想问问大家有没示例HDL代码,最好是verilog代码,从翻网页也发现实际上是有的,但是不知道为啥官网没有下载代码的地方,求求
    发表于 09-29 17:40

    喜讯!华清远见参与制定的《电子产品印制电路板可制造性设计(DFM)和可靠性设计规范》正式发布

    近日,由北京华清远见教育科技有限公司参与制定的《电子产品印制电路板可制造性设计(DFM)和可靠性设计规范》(标准编号:T/ZSA304-2025)正式获批发布。该标准经中关村标准化协会审查通过,成功
    的头像 发表于 09-01 10:30 1206次阅读
    喜讯!华清远见参与制定的《电子产品印制电路板可制造性设计(DFM)和可靠性<b class='flag-5'>设计规范</b>》正式发布

    PCB的接地设计规范与指南

    获取完整文档资料可下载附件哦!!!! 如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 08-01 17:41

    PCB设计规范123

    获取完整文档资料可下载附件哦!!!! 如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 07-14 16:22

    避雷针系统:规范安装、科学选型与专业施工方案

    指标以及选型策略。 一、 核心规范要求:构筑安全基石 避雷针系统的设计与施工必须严格遵循国家及国际权威标准,确保防护的有效性与持久性:国家强制标准: GB 50057《建筑物防雷设计规范》。 GB 50601《建筑物防雷工程施工与质量
    的头像 发表于 07-03 15:04 3903次阅读
    避雷针系统:<b class='flag-5'>规范</b>安装、科学选型与专业施工方案

    技术资讯 I 面向初级工程师的 PCB 设计规范

    工程师和电路板设计新手而言,掌握PCB设计规范至关重要。本文将深入解析常见的PCB设计规范和制造商要求,并概括介绍PCB设计规范的关键基础知识。线距和线宽是实现
    的头像 发表于 06-13 16:28 1883次阅读
    技术资讯 I 面向初级工程师的 PCB <b class='flag-5'>设计规范</b>

    防护电路设计规范

    需要完整版资料可下载附件查看哦!
    发表于 05-28 16:24

    【华为】软件设计规范

    获取完整文档资料可下载附件哦!!!!如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 05-27 15:48