Verilog语言:还真的是人格分裂的语言
“人气腹语术师天愿在现场披露了被人偶搭档夺取灵魂的腹语术师将妻子杀害的表演节目。天愿真的陷入了多重人格,命令自己杀害妻子和子的人偶的人格出现了。为了不(让自己)杀害和弟子登川有外遇的妻子,天愿提出委托想要监视,然而第二天早上,和子真的被杀害的事件发生了。天愿坦白很可能是在自己的意识失去的时候杀害的……”(----“真相只有一个”《名侦探柯南》一向是老衲喜欢的动画片)这个是第806回《腹语師的错觉》的介绍。
人有双重人格,或者叫人格分裂,那么语言呢?Verilog语言还真的是人格分裂的语言。前回书已经说到了,不能简单地把wire类型映射为组合逻辑,同时把reg类型映射为时序逻辑。事实上,这两个概念会交叉的。也就是说,wire类型极可能被综合为组合逻辑也可能综合为时序逻辑,reg类型也是这样。
“‘reg’是什么?”最微软的回答是:注册表文件。这个自然没错,但是违背了“到哪座山,唱哪里歌”的原则。一般的“标准”答案是:寄存器型变量。看看‘reg’,不就是‘register’(寄存器)的缩写吗?大多数中文教材中都是这样说的。
下面为了说明白这桩事情,请允许老僧引用IEEE有关Verilog语言里面的原文:
“Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg need not represent a hardware storage element since it can also be used to represent combinatorial logic.”
为了强调,表1里面给出了wire、reg类型和组合逻辑、时序逻辑之间的映射关系。
表1 wire、reg类型和组合逻辑、时序逻辑之间的映射关系
wire | reg | |
组合逻辑 | 可 | 可 |
时序逻辑 | 可 | 可 |
可见reg是“双面间谍”的工作性质,为了能够“左右逢源”,自然用法要比wire来的复杂。类型wire被综合为时序逻辑一般还真是写错了,不必细表。
1. 电平触发,组合实现
和reg“孟不离焦,焦不离孟”的是关键词always,这个要记清楚。人家wire和assign是夫妻,reg和always是一对,千万不要搞混了,这不是能拉郎配的季节。
“always”的语法结构是:
always @(sensitive_tabel)
其中,sensitive_tabel称作敏感列表,其中包含always内部操作的一个或者多个触发条件。字符“@”发音是“艾特”(at),大伙儿发电子邮件(e-mail)的时候常用,不罗嗦。
正如上面提到的、标准立面的说法可以是边沿敏感和电平敏感两种。对于组合逻辑电路,这个敏感列表里面所有条件均为电平敏感。逻辑上,当敏感列表里面的条件符合的时候,always内部的操作可以进行。但是,很多逻辑上可行的代码,由于没有实际电路的支持,是无法实现的。
在Verilog语言95版本里面,电平触发的敏感列表的写法是
triger1 or triger2 or triger3……
其中,triger1等为触发信号。当触发信号电平变化时,说明敏感列表里面条件符合。如果触发信号是向量,则其中一个比特的信号变化,就认为信号电平有变化。到了Verilog 2001版本,这个写法被更加简化了:“,”和“or”都可以用来分割敏感事件;并且,可以用“*”代表所有输入信号,这可以防止遗漏。例1给出了一些符合语法的always的例子。
always与敏感列表
always @ (triger1 or triger2 or triger3) //Version 95 and Version 2001
always @ (triger1 , triger2 , triger3) //Version 2001
always @ (*) //Version 2001
具有完全电平敏感列表的always模块,总叫人觉得就是组合逻辑了。再次强调数字电路是并行工作的,注意不要用“执行”这个词,不准确。对应的所有assign以及always带领的快都是并行的,其在代码中前后顺序与输出结果无关。也就是说例2里面的两段代码是等效的。代码中,敏感列表sensitive_table1和sensitive_table2对应操作Operation_A和操作Operation_B。
always所带操作顺序与输出结果无关
always @(sensitive_table1) Operation_A always @( sensitive_table2) Operation_B | always @( sensitive_table2) Operation_B always @(sensitive_table1) Operation_A |
理论上,assign后面只有一行,对于这个并行工作
verilog传奇 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)