Verilog

Verilog可以从五个层次对电路(系统)进行描述,包括:系统级、算法级、寄存器传输级(即RTL级)、门级、开关级。我们平时用的最多的为RTL级,故Verilog代码也经常被称为RTL代码。

基础语法

1
2
Always@(posedge clk)
Always@(negedge clk)

凡是带有posedge或negedge的always块,都会被综合成时序逻辑电路。

reg :除wire类型外,另外一种常用的数据类型,一般表示寄存器类型数据,不过并不绝对,记住一条原则:在always块内被赋值的信号应定义成reg型,用assign语句赋值的信号应定义成wire型

always/assign:两者都不可嵌套

  • assign语句只能实现组合逻辑赋值,且一个assign语句后面只能跟一条赋值表达式。

  • always即能实现组合逻辑赋值,又能实现时序逻辑赋值操作,且可以包含多条赋值表达式,多条赋值表达式,则应位于begin/end对中间。

设计规则:

i:在组合逻辑电路中,使用阻塞式赋值方式”=”;

ii: 在时序逻辑电路中,使用非阻塞式赋值方式”<=”

iii:在同一个always块内,只能存在一种赋值方式。

iv:一个信号,只能在一个always或一个assign语句下赋值。

v:原则上来说,一个always块内只处理一个或一类信号,不同的信号可在不同的always块内处理。

vi: always块内只能对reg型信号进行处理,不能对wire型数据赋值,也不能实例化模块

1
2
reg [7:0] mem [255:0];   // 256 unpacked elements, each of which is a 8-bit packed vector of reg.
reg mem2 [28:0]; // 29 unpacked elements, each of which is a 1-bit reg.

1-bit全加器

1
2
3
4
5
6
7
8
9
10
// Full adder module here
module add1 (
input a, input b, input cin,
output sum, output cout
);

assign sum = a^b^cin;
assign cout = (a&b)|(cin&a)|(cin&b);

endmodule