Verilog HDL 那些事儿 - 时序篇
Verilog HDL 那些事儿 - 时序篇
书语
书语
书语
书语
建模不是 Verilog HDL 语言的所有,建模只是使用 Verilog HDL 语言建立一个 “ 像模像
样 ” 的 “ 形状 ” 而已。这个 “ 形状 ” 实际上是很粗糙的,还没有经过任何深入的分析
。
但是我们不可以小看这个 “ 粗糙的形状 ” ,如果没有这个 “ 粗糙的形状 ” 模块的设计根
本无法完成。笔者在《 Verilog HDL 那些事儿 - 建模篇》的结束语中有这样讲过 : “ 建
模是一个粗糙的东西,它还可以继续细化 ” 。
“ 细化 ” 顾名思义就是进入模块的深层进行分析和优化 ( 如果有需要调试的话 ) 的工作
。
但是前提,我们必须 “ 更深入 Verilog HDL 语言的世界 ” 才能有效的 “ 细化 ” 模块 。 这
一本起名为《 Verilog HDL 那些事儿 - 时序篇 》的笔记分别有两个部分,上半部分和下
半部分。上半部分是 “ 步骤和时钟 ” ;下半部分是 “ 综合和仿真 ” 。
“ 步骤和时钟 ” 主要是深入讨论 “ 步骤 ” 和 “ 时钟 ” 在模块上的作用。宏观上 “ 步骤
”
是模块执行的 “ 拍子 ” , “ 时钟 ” 是模块的 “ 心跳 ” 。微观上 “ 步骤 ” 是模块 “ 操作的过
程 | 状态 ” , “ 时钟 ” 是模块 “ 消耗的最小单位 ” 。 其实 “ 步骤和时钟 ” 它们是形影不离的
兄弟,有 “ 步骤 ” 出现的地方,就有 “ 时钟 ” 的故事,为什么笔者会如此注重 “ 步骤
”
和 “ 时钟 ” 呢?
当某个模块要完成更多工作的时候 , 传统的状态机会使得模块的内部臃肿和模块的表达
能力下降等问题(这不是笔者的一厢情愿的看法,而是众多初学者都会遇见的问题 ) 。
一旦我们用 “ 步骤 ” 来取代 “ 状态机 ” ,那么我们就可以实现如 “ 仿顺序操作 ” 等更多
花样的建模技巧来支持设计 。 “ 步骤 ” 的优点不仅只是方便了建模的工作 , 而且 “ 步骤
”
也有显性指示模块的操作过程和状态。这些好处对模块的 “ 细化 ” 起到很大的帮助。
关于 “ 时钟 ” 它和另一个重点有莫大的联系,就是 “ 模块的沟通 ” 。虽然说 “ 时钟 ” 是
“ 模块最小的消耗单位 ” , 模块之间如果发生了 “ 沟通失误 ” , 这些问题很多时候是模块
之间的 “ 沟通 ” 因为慢了一个 “ 时钟 ” 或者快了一个 “ 时钟 ” 而引起的 。 低级建模是一
个多模块的建模,自然而然笔者会非常的重视 。 “ 沟通失误 ” 不只是会发生在模块的外
部 , 而且也会发生在模块的内部 。 了解 “ 时钟 ” 能最大程度的分析模块和 “ 细化 ” 模块 。
“ 综合和仿真 ” 主要是把 “ 综合 ” 和 “ 仿真 ” 放在同一个平台来学习 。 许多初学者喜欢
把 “ 综合 ” 和 “ 仿真 ” 看成两个平台的东西 , 如一个常见的观点 , 很多朋友都会认为 “ 建
模是用综合 ; 仿真是用验证 ” 。 这个观点不是不正确 , 只是有点遗憾而已 。 当我们把 “ 综
合 ” 和 “ 仿真 ” 拆开为两个平台 , 模块 “ 细化 ” 的可能性不但会降低不少 , 此外还会 对
Verilog HDL 语言的学习带来不少难题。
当我们尝试把把这两个东西放在同一个平台上 , 重新思考 , 我们会发现到 , 用在 “ 建模
”
上的 “ 一套思想 ” 也适合用在 “ 仿真 ” 上。如果用傻瓜的话来说,我们知道 “ 建模 ” 的
工作是针对某个资源然后去描述它的形状 , 最终的目的还是要下载到 “ 现实的环境 ” 中
。
然而 “ 仿真 ” 比起这个 “ 现实的环境 ” , 它是一个 “ 理想 ” 的 “ 虚拟环境 ” , 在这个 “ 理
想的虚拟环境里 ” 不存在任何物理的问题 , 而且也充满着任何可能性 。 你要什么输入都
Verilog HDL 那些事儿 - 时序篇
可以创造 , 模块的任何输出都是显性而且可见的 。 只要我们明白了这个简单的道理 , “ 建
模 ” 和 “ 仿真 ” 的关系是多么 “ 亲近 ” 的 , 它们的区别只是 “ 在不同的环境执行而已 ” 。
初学者往往都会觉得 “ 仿真 ” 最大的难题就是 “ 如何编辑激励文件 ” 。在这里如果用笔
者自己一套的思路重新定义 “ 仿真 ” 的话(从笔者的角度去看 “ 仿真 ” ) 。 “ 激励 ” 就是
这个整个仿真的执行过程而已 , “ 如何编辑激励文件 ” 等价于 “ 如何安排仿真过程 ” 。 在
这个时候 , 建模技巧就会帮到很多大忙 , 我们可以基于综合语言去编辑这个仿真过程 ( 激
励文件 ) 。
当然 , “ 仿真 ” 在这本笔记里的要表达的是 “ 以显性的方式去观察模块的输出,从而以
最大程度去细化模块 ” ,然而 “ 如何透过仿真的波形图去执行对模块的优化和调试 ” 就
是这本笔记的重点内容 。 学会编辑激励文件 , 充其量只是为了让模块达到 “ 预期的输出
效果 “ 而已 。 如果要读懂隐藏在波形图中那些信息 , 并且用在调试和优化上 , 那么就必
须掌握好 Verilog HDL 语言一定的基础。
Verilog HDL 那些事儿 - 时序篇
前言
前言
前言
前言
在完成《 Verilog HDL 那些事儿 - 建模篇》之后,笔者老是觉得物有所不足,所以笔
者继续着手了第二篇的《 Verilog HDL 那些事儿 - 时序篇 》 。就如同书语所说的那样
,
“ 建模过后的模块是很粗糙,所以我们必须细化它 ” - 是这一本笔记的主要内容。
为什么这一本笔记要名为 “ 时序篇 ” 呢?
“ 时序 ” 最容易联想到就是 “ 时序图 ” ,亦即模块的输出。换句话说 “ 时序 ” 是模块执
行过程的显性记录 。 一般在仿真上 , 模块的时序图都是在理想状态下 ( 没有任何物理上
的问题)产生的。时序图里边包含了模块最清洁的执行记录。这些信息对于 “ 细化 ” 模
块来说有很大的帮助。然而影响着这些时序就是 Verilog HDL 语言本身。
很多时候,虽然低级建模(建模技巧)已经可以帮助我们完成许多模块设计上的要求
,
但是低级建模始终是属于 “ 建模 ” 的层次 , 亦即 “ 塑造 ” 模块一个大概的形状 , 而且是
粗糙的东西而已 。 这粗糙的东西 , 效果能不能发完全发挥 ? 我们需要经过 “ 细化 ” 它才
知道结果。
要完成 “ 细化 ” 的过程一点也不可以马虎。早期的建模必须留下可以 “ 细化 ” 的种子
。
此外我们还要往模块更深入去了解它 , 去分析它 , 如果有模块有问题就调试它 。 这全部
的工作要求 , 更进一步挑战我们对 Verilog HDL 语言的认识和掌握的程度 。 有关这一点
,
再也不是:了解 Verilog HDL 语言相关的语法如何使用?如何使用 Verilog HDL 语言建
立一个模块?等这些 Verilog HDL 语言 “ 外观的单纯工作 ” ,而是 “ 深入分析 ” 模块执
行时的 “ 内部细节 ” 。关于模块一切的一切过程,我们只能在 “ 时序图 ” 上了解而已。
这就是这本笔记命名的初衷。
笔记内容可以说是五花八门 : 有算法 , 有建模技巧 , 有建模 , 有编辑激励文件 , 有仿真
,
有调试 .... 等一大堆的东西 。 “ 算法 ” 方面有比较常用的乘法算法和除法算法 ( 算法
作为深入理解步骤和时钟的帮手 ) 。 “ 建模技巧 ” 方面有 “ 流水操作 ” 的建模方法 。 “ 建
模 ” 方面有同步 FIFO .... 等等等。说实话,笔者也觉得笔记的内容有点像 “ 菜市 " 。
当然 , 笔记的所有内容都是围绕笔记的重点展开的 , 和 《 Verilog HDL 那些事儿 - 建模篇
》
一样 , 每一篇的联系性都很强 , 谁少了谁都不行 。 嗯 ! 关于笔记的下半部分 “ 综合和仿
真 ” ,笔记在开始写之前笔者考虑了很多问题。在这里,笔者使用了自己另一套的想法
重新定义仿真 , 这方法完全是颠覆网络上一套常用的仿真方法 , 感觉上笔者在干唱反调
的工作 ... ⊙ ﹏ ⊙ b 汗
这也是笔者最担心的事情,笔者怕遭到围观,被淹死在口水中 .... ( ╯ 3 ╰ ) !虽然如
此,但是为了使学习有更多选择,故笔者才决定写下来。
这一本笔记的初衷是为了完善《 Verilog HDL 那些事儿》系列的笔记。比起 “ 建模篇 ”
,
“ 时序篇 ” 这一本笔记的内容确实是少了不少,但是量少不代表质少。和 “ 建模篇 ” 相
Verilog HDL 那些事儿 - 时序篇
比的话 “ 时序篇 ” 的内容难度事实上是高了不少 。 “ 时序篇 ” 和 “ 建模篇 ” 同是一样,
都是 Verilog HDL 语言的核心部分,所以笔者加重马力去维护笔记的内容。学习 “ 时
序篇 ” 不像学习 “ 建模篇 ” 那样 , 可以一边学习一边喝牛奶那样轻松 , 需要用更多的脑
力去思考笔记每一章节的重点。所以呀,记得学习忽太过 “ 蜻蜓点水,点过就算 ” ,不
然的话就对不起自己了。
akuei2 23-01-2011