`
yidongkaifa
  • 浏览: 4059604 次
文章分类
社区版块
存档分类
最新评论

Verilog 学习日志

 
阅读更多

1、Verilog HDL简介

Verilog HDL是出现较早的硬件描述语言(HDL),比VHDL还要早,所以用户较多,特别是在工业应用,而VHDL是由美国军方开发的一种硬件描述语言,也是IEEE的标准,但应用不如Verilog广泛,在教学上应用较多。

Verilog 的第一版IEEE标准是1364-1995,后来又绝对修改为1364-2001,到2005年Verilog 被分为两支,都是对2001标准的修正与扩展,分别称为1364-2005和SystemVerilog-2005。现在多数EDA工具都支持Verilog -2001和SystemVerilog-2005,对Verilog-2005还不是太清楚有哪些改动,有待学习。

2、Verilog与VHDL的简单比较

Verilog语法与C语言非常相似,语法结构清析、简洁、灵活。一般的硬件工程师对C比较熟悉所以学起来比较方便。Verilog不是强类型,变量只有两种类型wire与reg,所以用起来比较灵活,但语法不严格,容易出错,而VHDL是强类型,类型丰富,语法严谨,不容易出错。

可能VHDL是出于军方的原因,语法严谨是其一突出特点。语法太严格对书写要求也就较高,可能会让编程者书写一大堆无关紧要的代码,所以有些开发人员就不愿意用,一开始学习VHDL,到后来还是用Verilog做开发。

3、Verilog学习笔记

1)wire与reg
Verilog中一共就有两种数据类型,wire与reg,而且两者的使用场合很容易区分。wire就是线,reg就是寄存器,跟硬件是紧密关联的,很容易与硬件建立联系。

引脚定义:一般地输入用wire型,输出用reg型,如果没有寄存器生成输出也用wire型
中间变量:如果仅仅是给连线的一个节点命名则用wire,如同电路图中的net名,reg用于定义循环变量、寄存器变量等

2) 双向口的定义
双向端口是net类型,不能直接给其赋值
首先在端口列表中定义双向口,定义一个reg型的变量,相当于定义一个缓冲器,先把要输出的值送到REG变量中,然后用assign语句将REG变量的值赋给双向端口。当双向端口当输入使用时,可以直接当成一个普通的输入端口读取其值。
示例代码如下:
module bidircBus(ctrl,DataIn,DataOut,DataInout);
input ctrl;
input [3:0]DataIn;
output [3:0]DataOut;
inout [3:0]DataInout;
assign DataOut=DataInout;
assign DataInout=(ctrl==1"b0)?DataIn:"bz;
endmodule

编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.
当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.此时可以用assign语句实现:assign data_inout=link?data_in_t:1'bz;其中的link ,data_in_t是reg类型变量,在测试模块中赋值.
另外,可以设置一个输出端口观察data_inout用作输出的情况:
Wire data_out;
Assign data_out_t=(!link)?data_inout:1'bz;

3) 编程风格讨论

a) begin...end块
begin 与 end 如果缩进,太多的话会缩进得太多,屏幕本身还要放置其它窗口,缩进太多则显得文本太宽,如果不缩进,与always,for, if等对齐,则读起来又显得不是太舒服,把begin放到always,for,if等词之后则较好,end与 之对齐,如:
always @ * begin
if ( !nEn ) begin
out = 1;
end
end

b) 尽量使每一个always块最小,这样就要对信号的模块进行分组,原则是尽可能地以输出信号人准分组,同一组输出变量分到一个always块中,其它块中不对该变量赋值,这样就不会在多个always块中给同一变量赋值。而且便于检查是否有由于对if或case的语句情况考虑不足产生不必要的锁存器。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics