verilog 95和01区别(自己整理)
### Verilog 95与2001标准的主要区别 #### 模块定义 Verilog 95标准中,模块的定义方式较为简单,输入输出端口声明可以在括号内直接给出名称,如: ```verilog module aaa(clk, datain, dataout); input clk; input [7:0] datain; output [7:0] dataout; wire [7:0] dataout; ... endmodule ``` 而Verilog 2001则要求在模块定义时明确指出端口的数据类型和方向,例如: ```verilog module aaa(input clk, input wire [7:0] datain, output wire [7:0] dataout); ... endmodule ``` 这种变化提高了代码的可读性和清晰度。 #### 端口定义 在Verilog 2001中,端口的定义更为灵活,可以同时指定端口的方向和类型,例如: ```verilog output [31:0] result; wire [31:0] result; output wire [31:0] result; ``` 此外,Verilog 2001还新增了`signed`类型,使得数据可以通过补码形式表示,这对于进行精确的数学运算非常有用。 #### REG定义 在Verilog 95中,REG类型的变量定义和初始化是分开的,而在Verilog 2001中,定义和初始化可以合并到一行代码中完成,例如: ```verilog reg clk; initial clk = 0; ``` 在Verilog 2001中,可以直接写成: ```verilog reg clk = 0; ``` 这种改变简化了代码结构,提高了编写效率。 #### 缺省位扩展 Verilog 2001对于位宽大于32位的变量,当赋值时未指定基数,则只会将低32位设置为指定值,而高位会被自动填充为0。例如: ```verilog reg [63:0] data; data = 'bz; // 仅低32位被设置为高阻态,其余位为0 ``` 为了使所有位都设置为高阻态,需要明确指定位宽,例如: ```verilog data = 64'bz; // 所有位都被设置为高阻态 ``` #### 敏感信号 在Verilog 2001中,敏感信号列表可以使用星号`*`来代替所有的敏感信号,避免了产生锁存器的问题。例如: ```verilog always @(a or b or c or d or sel) ... ``` 可以简化为: ```verilog always @(a, b, c, d, sel) ... ``` 或者使用通配符`*`: ```verilog always @(*) ``` #### 指数运算 Verilog 2001支持指数运算,例如: ```verilog result = base ** exponent; ``` 这使得在HDL设计中实现数学计算变得更加方便。 #### 递归函数和调用 Verilog 2001新增了一个关键字`automatic`,使得函数可以在自身内部调用,从而支持递归操作。例如: ```verilog function automatic [63:0] factorial; input [31:0] n; if (n == 1) factorial = 1; else factorial = n * factorial(n - 1); endfunction ``` #### 有符号数运算 Verilog 2001增强了有符号数的支持,允许开发者直接指定变量是否为有符号类型,并提供了相应的运算符来进行有符号数的运算。例如: ```verilog reg signed [63:0] data; input signed [31:0] a; function signed [128:0] alu; 16'shC501 // 有符号的16位十六进制值 ``` 还支持通过`$signed`和`$unsigned`函数进行有符号与无符号之间的转换。 #### 算术移位操作 Verilog 2001改进了移位操作,包括逻辑右移(`>>`)和算术右移(`>>>`)。例如: ```verilog D = 8'b10100011; D >> 3; // 逻辑右移得到8'b00010100 D >>> 3; // 算术右移得到8'b11110100 ``` #### 多维数组 Verilog 2001支持多维数组的定义和访问,这为存储复杂的结构提供了便利。例如: ```verilog wire [7:0] array3[0:255][0:255][0:15]; wire [7:0] out3 = array3[addr1][addr2][addr3]; ``` 还可以通过索引访问特定维度中的值,如: ```verilog reg [31:0] array2[0:255][0:15]; wire [7:0] out2 = array2[100][7][31:24]; ``` #### 向量部分选择 Verilog 2001允许使用变量作为向量的起始位置,例如: ```verilog [base_expr+:width_expr] // 正偏移 [base_expr-:width_expr] // 负偏移 ``` 其中`base_expr`可以是变量,而`width_expr`必须是常量。 #### 常量函数 Verilog 2001增加了`constant function`,这类函数只能用于操作常量。例如: ```verilog function integer clogb2(input integer depth); begin for (clogb2 = 0; depth > 0; clogb2 = clogb2 + 1) depth = depth >> 1; end endfunction ``` #### generate语句 Verilog 2001引入了`generate`语句,这是一种循环结构,可以用于动态生成多个模块实例、原始设备、变量等。例如: ```verilog generate for (genvar i = 0; i < 4; i = i + 1) begin : inst_gen instance_name #(parameter) instance_name(.port_name()); end endgenerate ``` 在`generate`语句中可以嵌套使用`if-else`和`case`语句,以便根据不同的条件生成不同的实例。 总结而言,从Verilog 95到2001版本的升级不仅提高了代码的可读性、灵活性和维护性,还增强了对高级数据类型的支持,引入了更强大的语言特性,为硬件设计人员提供了更多的工具和支持。
剩余18页未读,继续阅读
- 粉丝: 3
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助