作者Zephyr750 (红莲西风750)
看板Electronics
标题[心得] verilog code 语法心分享
时间Sun Apr 17 16:48:37 2011
先说我不是高手!但是在verilog中略有心得
PTT的C_CPP版得知Programing版
在Programing版讨论HDL串中发现此版
小小的浏览一下发现对於verilog有很多讨论
就想在此与版友分享
----------------癈话完毕--------------------
Verilog Code是硬体,写出来的就是元件(不只是语法)
所以,新手要练到
1.在写的同时,可以知道自己写的是什麽元件
2.在合成的同时,可以知道合成出来的档是什麽
是一件很重要的事
先来说第一件事
「在写的同时,可以知道自己写的是什麽元件」
要对於语法与元件的意义了解到某种程度,才可以掌握得很好
那语法要怎麽了解呢?(此篇先讨论这件事吧?!)
HDL大致上分成两种电路
1.有clk
2.无clk
学术上(或业界)使用的词很多!像Gate level、RTL...来分类电路
在此尽可能不要提这些专有名词(因为我也搞不太懂)
「有clk」的电路属於「受时间控制」的电路
也就是 触发时 输入是什麽,输出才是什麽,花的时间以clk数(全波)计算
例如:
在Verilog中
always@(posedge clk) 表示 在clk正缘触发时,以下电路动一次
always以下描述的电路随clk的正缘变化才存在(动作)!
输入是什麽东西,变化了几次,都不存在(动作或影响)...
这也是最常见的写法
还有「<=」的语法
「<=」代表不等待上一行回应,完成马上执行
(这观念是老师教的,我自己还没有很懂!但老师的确是这样讲的没错)
我自己的理解是「触发同时执行」(相同时间,也就是随时间控制)
所以「<=」会放在「always@(正缘或负缘 clk)」的里面。
还有「reg」的语法
在特定时间时,才更新内容的电路元件
不然储存的内容不变(储存功能就这样出现了)
所以「reg」会放在「<=」的左边,因为要更新资讯。
「无clk」的电路属於「不受时间控制」的电路
: -也就是输入是什麽,输出马上就是什麽,花的时间以gate count计算
+也就是输入是什麽,输出马上就是什麽,花的时间以gate delay计算 //bakerly更正
例如:
在Verilog中
assign ...
assign後面描述的电路为永久存在!
只要输入变化,输出也就会马上变化
(因为没有时间条限制电路的存在性)
同义写法为(个人不常这麽写,不过很多assign可以用这个取代)
always@* 或 always@(a, b, c, ...)(没有正负缘)
还有「=」的语法
「=」代表等待上一行回应後,再执行
(这观念是老师教的,我自己还没有很懂!但老师的确是这样讲的没错)
就是不随时间影响,永久存在的电路(接线之类的)
所以「=」会放在always@(正缘或负缘 clk)外面
还有「wire」的语法
字面上是线,但是它代表永久存在的资料空间,只要输入改变输出就改变
(所以,不拿来用在储存资料)常用在元件之间的立即传递资料
这种电路速度极快!不用等clk完成全波,马上就可以做很多动作(只要输入一直变)
但是容易失控
----------------------------------------------------------------
接下来讲常见句子
先说无clk的
assign a = (c > 10) ? b : b+1;
(c > 10)?
也就是
if(c > 10)(这种写法在有clk的比较常见,只差在一个DFF)
代表一个方块,里面很多逻辑闸,在条件成立时输出为hi(1bit的讯号输出)
这个方块已经在synthesis时最佳化(用数位逻辑教的方法)
输出的线接给一个2to1的选择器
输入都算好了 b, b+1,输出就等选择的线决定谁要输出
assign a = b + c;
assign a = b;
assign a = ....
剩下的我想不用我多说了!多练习就可以看懂复杂的Gate level电路了!
再说有clk的电路
always@(posedge clk)
代表以下电路都有接clk这条线,并且是正缘触发(没有小圆圈)
+---- +----
clk | clk |
----|> ----o|>
| |
+---- +----
正缘 负缘
always@(poedge clk, negedge rst)
begin
if(!rst) → 在此一定要使用!,而且上面的negedge rst一定要写
...
end
有写 negedge rst 电路不会把
if(!rst) //若rst负缘触发
当作是
if(rst == 0) //若rst低准位
或
if(~rst) //若rst低准位
在有clk影响的电路将clk和rst设定好之後,就看见以下的语法(常用语法)
(因大多数电路都是用DFF组成,
所以rst通常都会设定,不过也有不用的时候!)
always@(posedge clk, negedge rst) //正负缘看需求订定
begin
if(!rst)
begin
....(初始化设定)
end
else
begin
....(电路function)
end
end
以上,应该可以应付很多新手观念上模糊的问题了!
之後只要依一开始讲的方向去做,合成完看RTL、synthesis report的时间估计
以及档案之间的变化,慢慢的就可以成为高手了!
而合成的过程也可以在coding时掌握住!也就有写元件的感觉了....
在那时,如果有人问你,你可以说「我不是高手!不过略懂..」
跟别人分享心得,互相成长!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.80.140.211
1F:推 pachingoo:推 04/17 18:48
2F:推 xwxw:推 04/17 20:02
3F:推 robertshih:"="与"<="的涵意很深 如果做到synthesis就看得出差异了 04/17 20:25
4F:推 pupucar:不使用专有名词而喜欢用自己的语言 等你出来工作就知道死 04/17 20:45
5F:→ pupucar:除非你天纵英才 可以一人搞定专案 都不用cowork的 04/17 20:47
6F:→ Zephyr750:楼上!只是本篇不用!不代表一辈子不用....XD 04/17 20:53
7F:推 echw:推!! 不过很多东西还是自己摸过才知道 04/17 21:25
8F:→ echw:像前面有人说的 "=" 和 "<=" 不完全是原PO所解释得如此 04/17 21:26
9F:→ echw:比较简单的用法里面 "="可以用在你像是写"c语言"那样用 04/17 21:28
10F:推 echw:初学者通常会在"="和"<="有疑问 是因为写道"always" 04/17 21:30
11F:→ echw:always里面的描述 可以类似电路化的思考 用"<=" 04/17 21:32
12F:→ echw:或者"c语言"的方法 用"=" 这是比较基础的概念 04/17 21:32
13F:→ Zephyr750:我个人不推荐把c语言和HDL语言拿来比较或介绍观念... 04/17 21:41
14F:→ Zephyr750:我改一下好了! 04/17 21:42
※ 编辑: Zephyr750 来自: 114.33.224.25 (04/17 21:45)
※ 编辑: Zephyr750 来自: 114.33.224.25 (04/17 21:46)
15F:→ Zephyr750:好像愈改愈看不懂!^^" 04/17 21:47
16F:推 echw:已经写得很好了XDD 04/17 21:55
17F:推 maxwellee:推推推 04/18 02:24
18F:推 luckyBF:推一下 04/18 07:39
19F:推 masage0514:大大 我想请问 !rst跟~rst难道不一样吗?差在哪?谢谢 04/20 12:48
20F:→ uxijgil:reg不一定是受时间控制的 ex: reg a; always @(*) a = b; 04/20 21:35
21F:→ uxijgil:!(2'b10) = 1'b0 ; ~(2'b10) = 2'b01 ; 对单讯号则没差 04/20 21:37
22F:→ Zephyr750:~所有bit反向, ! 1'b1(最小的bit)反向 04/20 23:20
23F:→ Zephyr750:!(2'b10) = ~(1'b0) = 1'b1 好像是这样才对 04/20 23:23
※ 编辑: Zephyr750 来自: 114.33.224.25 (04/21 00:02)
24F:推 Pash77:错 !2'b10 = ~(2'b10==0) = ~0 = 1 不然你用 !2'b01 就知 04/21 06:42
25F:→ Pash77:我也写错! 是 !=0 才对 04/21 06:43
26F:推 Pash77:!rst = !(rst!=0) 所以 rst=0 时 !(0!=0)=!0=1 04/21 06:46
27F:→ Pash77:这个全华中译本应该有吧? 04/21 06:48
28F:推 pikachu2005:推~+1 04/21 13:55
29F:推 potatojerry: ~: bitwise, ! : logical 04/22 23:09
30F:→ bakerly:gate count是面积单位,不是时间单位, wire真的就是线 04/23 22:08
※ 编辑: Zephyr750 来自: 59.120.98.226 (11/14 11:23)
31F:推 tj0706: 推推 04/07 11:34