这篇帖子用于记录学习Verilog过程中的一些syntax的问题,会不断更新,有不正确的地方请各位帮忙指正:D
一.Verilog 语法中的可综合性
Verilog HDL 真的很强大,如果程序只用于仿真,那么几乎所有的语法和编程语句都可以使用。但如果程序是用于硬件实现,那么我们就必须保证程序的可综合性,即所编写的程序能被综合器 转化为相应的电路结构。不可综合的HDL语句在用综合工具综合时将被忽略或者报错。作为设计者,应该对可综合模型的结构有所了解。
虽然不同的综合工具对Verilog HDL语法结构的支持不尽相同,但Verilog HDL中某些典型的结构是很明确地被所有综合工具支持或不支持的。
(1)所有综合工具都支持的结构:
always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,
function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,
input,instantitation,module,negedge,posedge,operators,output,parameter。
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,
task,while。
看到一些资料上说其实Verilog HDL的产生是为了写testbench,而编程设计只用到了其中的很少的部分。Verilog有人说很好学,很容易入手,但是我觉得仅仅入手是没有用的,充其量就鸡肋一根,一定要仔细深入研究语法和结构,这样才能写出高效率的代码,否则基本的代码一塌糊涂的话后面的功能仿真,时序仿真都是浮云。
|
|
二.避免锁存器
  在 always 块的 if..else 语句中如果所列的条件不完整,综合时则会产生锁存器。
example:
always @(action)
          if(action)  out1 <= 1'b1;

        没有考虑到 !action 的情况,默认out1保持不变,这就产生了锁存器。
优化方法:1.列出 !action 的情况,2.对out1赋初始值
1.always @(action)
          if(action)  out1 <= 1'b1;
else    out1 <= 1'b0;
|
2.always @(action)  begin
out <= 1'b0;
if(action)  out1 <= 1'b1;
end
但是,在描述时序逻辑的时候,也通常利用 if 语句的隐式条件对带时钟使能的 D 触发器建模
example:
always@(posedge clk, negedge rst_n)  begin
if(!rst_n)  sum <= 0;
else if(EN)  sum <= a+b;
表示在时钟正沿来临时,如果 EN 为 1 ,则将 a+b 的值赋给 sum, 言下之意是如果 EN 为 0, 那么 sum 保持原值不变。这里综合工具会把代码综合成一个带时钟使能的 D 触发器。
三.产生占空比不等于50%的波形 (状态机的巧用)
在面试的时候常常看到一些对verilog用得不熟的同学,在被要求写出可综合的RTL代码并产生占空比不同的输出脉冲时,选择用很多计数器来对输入的脉冲进行计数,而且还分别对输入脉冲的上升沿和下降沿进行计数,非常的糟糕,因为输入的脉冲一般只能保证一个触发沿是稳定的
如果要产生占空比相同的波形,那么计数器可以很简单的搞定。
例如:将一个200kHz的时钟做2分频,4分频,8分频,这时候你也许会想到用PLL,但是这里的时钟速率是kHz级别,很低,无法使用PLL。
可以这样设计:

    reg [2:0] cnt;
    always @(posedge clk_200k, negedge rst_n)
     if(!rst_n)
      cnt <= 3'b000;
     else 
      cnt <= cnt + 1'b1;
  
    assign clk_100k = cnt[0];
    assign clk_50k  = cnt[1];
    assign clk_25k  = cnt[2];
如要要求产生一个占空比为1:4的波形,用计数器实现的话就很麻烦了,在这种时候就可以用一个简单的状态机来实现。
000->001->110->100->010->
|               |
<----<----<----<----<----<-
利用状态机就很简单的实现了占空比不同的波形的产生。
代码如下:
1   reg [2:0] state;
2
3   always @(posedge clk, negedge rst_n)
4   if(!rst_n)
5    state <=3'b000;
6    else
7    case (state)
8    3'b000: state <= 3'b001;
9    3'b001: state <= 3'b110;
10    3'b110: state <= 3'b100;
11    3'b100: state <= 3'b010;
12    3'b010: state <= 3'b000;
13    default : state <=3'b000;
14    endcase
15
16   assign clk_out = state[0];
17

    仿真波形:

  

  状态机的设计水平直接反映了工程师的逻辑功底,要写好状态机就一定要多练习。
 
                    

转载于:https://www.cnblogs.com/semiok/archive/2010/10/13/1849730.html

[笔记][原创]Verilog HDL语法分析笔记相关推荐

  1. Verilog HDL程序笔记2

    Verilog HDL程序笔记2 Verilog HDL程序笔记1:写出属于你的第一个Verilog HDL模块 文章目录 Verilog HDL程序笔记2 前言 一.如何测试模块? 1.仿真平台 2 ...

  2. Verilog HDL 学习笔记3-Latch

    Verilog HDL 学习笔记3-Latch 第一次接触Latch是在大二学习数电的时候,那时候Latch被翻译成锁存器,当时还纠结着锁存器和寄存器的区别(要是当时我知道他俩的英文名叫latch和r ...

  3. Verilog HDL学习笔记

    目录 1 硬件描述语言简介 1.1 概述 1.2 HDL语言特点 2 程序的基本语法 2.1 Verilog HDL 程序结构 2.1 Verilog HDL 程序规则 模块 连续赋值语句assign ...

  4. Verilog HDL 学习笔记2-blocking and non-blocking assignment

    2013年5月6日 10:42:38 Verilog HDL 学习笔记2-blocking and non-blocking assignment ---学习贵在总结,将学习的心得体会记录 在学习ve ...

  5. Verilog HDL学习笔记(一)常见错误

    我初学verilog语言,很多细节都没注意,按着自己的思想就写了,编译的时候才发现各种问题.这些都是我在学习中遇到的问题,还是很常见的. 1.Error (10028): Can't resolve ...

  6. 三、6【Verilog HDL】基础知识之门级建模

    参考书籍:<Verilog HDL 数字设计与综合>第二版,本文档为第5章的学习笔记.由于本章也讲述的建模方式.该建模方式是通常设计师常用的底层抽象层次.更为低层的为开关级建模. 想了解更 ...

  7. Verilog HDL 语法学习笔记

    今天给大侠带来Verilog HDL 语法学习笔记,话不多说,上货. 关于详细的VHDL语法以及Verilog HDL语法可参见往期文章. 一周掌握 FPGA VHDL Day 7 暨汇总篇 一周掌握 ...

  8. FPGA学习笔记---Verilog HDL 可综合语句和不可综合语句汇总

    作为HDL语言,有两种基本的用途:系统仿真和设计实现.所有的HDL描述都可用于仿真,但并非所有的HDL描述都可综合. 一般综合工具支持的Verilog HDL结构 Verilog HDL结构 可综合性 ...

  9. HDLBites学习笔记之Error (10200): Verilog HDL Conditional Statement error at top_module

    HDLBites 第84题 异步复位D 触发器 https://hdlbits.01xz.net/wiki/Dff8ar 报错Error (10200): Verilog HDL Conditiona ...

最新文章

  1. 图解计算机图形学三维变换算法
  2. JavaScript核心语法总结
  3. Nginx缓存引发的跨域惨案(转:https://www.baidu.com/home/news/data/newspage?nid=9966642810298490574n_type=0p_f)
  4. hibernate5.2.10.Final基本配置
  5. data Mining with Weka: Trailer More Data Mining with Weka 用weka 进行数据挖掘 Weka 用weka 进行更多数据挖掘...
  6. python进阶与数据操控_python进阶(mysql:表操作、数据操作、数据类型)(示例代码)...
  7. python启动方法_python启动服务
  8. 为所欲为表情包制作器
  9. 实践“鱼塘养鱼论”,不断养鱼和捕鱼
  10. 集中趋势度量Measures of Central Tendency
  11. Hudi Timeline简析
  12. [学习笔记]UnityShader入门精要_第12章_屏幕后处理效果
  13. java实现爬取文本中的手机号、邮箱以及电话号码
  14. python海龟图画皮卡丘_用python画一只皮卡丘
  15. 美颜SDK架构技术分析
  16. vscode终端无输出
  17. 封装、继承、多态 通俗理解
  18. 编写程序计算交错序列_求给定精度的简单交错序列部分和
  19. python语言实验指导答案_Python实验指导书
  20. Norton 诺顿 全球第一杀毒软件

热门文章

  1. dvwa详解_DVWA(六):XSSReflected 反射型XSS全等级详解
  2. matlab用for编写乘法表,实验二 Matlab程序设计基本方法1
  3. android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...
  4. php怎么写for循环,PHP for循环的写法和示例
  5. 基于注解的字段脱敏处理
  6. 会话跟踪技术之HttpSession
  7. 剑指offer:18-21记录
  8. leetcode28. 实现 strStr()
  9. kmp2-HDU1358 HUST1010 POJ2406 POJ2752
  10. python如何运用ols_使用OLS回归(Python,StatsModels,Pandas)预测未来值