手把手教你自己动手写cpu(十)--Verilog HDL基本要素

目录

1. 关键字

2. 数据类型

基本数据类型

用户定义的数据类型

3. 模块定义

4. 逻辑描述

时序逻辑

组合逻辑

5. 敏感列表

6. 任务和函数

任务(Task)

函数(Function)

7. 测试平台

总结


 

Verilog HDL(Hardware Description Language)是一种用于描述和验证数字系统的硬件描述语言。它提供了一套完整的语法和语义规则,使得设计师可以使用高层次的语言来描述硬件行为、结构和接口。以下是 Verilog HDL 的基本要素,包括关键字、数据类型、模块定义、逻辑描述等方面的内容。

1. 关键字

Verilog HDL 中的关键字用于定义语言的各种结构和行为。以下是一些常用的 Verilog 关键字:

  • 模块定义相关
    • module:定义一个新的模块。
    • endmodule:结束一个模块的定义。
    • input:定义输入端口。
    • output:定义输出端口。
    • inout:定义双向端口。
    • wire:定义线网类型的变量。
    • reg:定义寄存器类型的变量。
  • 控制流语句
    • if:条件语句。
    • else:与 if 结合使用的条件分支。
    • case:多路选择语句。
    • default:用于 case 语句中的默认分支。
    • while:循环语句。
    • repeat:循环次数已知的循环语句。
    • forever:无限循环语句。
    • for:带有初始化、终止条件和增量的循环语句。
  • 时序逻辑描述
    • always:时序逻辑块。
    • initial:初始化块。
  • 任务和函数
    • task:定义一个可执行的任务。
    • function:定义一个可返回值的函数。
    • return:从任务或函数中返回值。
  • 其他关键字
    • parameter:定义参数。
    • localparam:定义局部参数。
    • genvar:生成变量。
    • generate:生成语句。
    • endgenerate:结束生成语句。
    • define:宏定义。

2. 数据类型

Verilog HDL 支持多种数据类型,包括基本数据类型和用户定义的数据类型。

基本数据类型

  • 整型
    • integer:整型变量。
    • time:时间类型变量。
  • 逻辑类型
    • bit:单比特类型。
    • logic:逻辑类型,通常用于代替 wire 和 reg
  • 整数类型
    • reg:寄存器类型,用于存储状态。
    • wire:线网类型,用于连接信号。
    • tri:三态线网类型。
  • 向量类型
    • [high:low]:定义向量的位宽,其中 high 是最高有效位,low 是最低有效位。
  • 枚举类型
    • enum:枚举类型,用于定义有限的命名值集合。
  • 字符串类型
    • string:字符串类型。

用户定义的数据类型

  • 结构体类型
    • struct:用户定义的结构体类型。
  • 数组类型
    • array:用户定义的数组类型。

3. 模块定义

模块是 Verilog HDL 中的基本单位,用于定义硬件组件。模块定义包括模块头部、端口列表、内部信号声明、逻辑描述以及模块尾部。

 

verilog

深色版本

1module moduleName (
2    input wire clk,
3    input wire reset,
4    input wire [7:0] data_in,
5    output reg [7:0] data_out
6);
7
8// 内部信号声明
9reg [7:0] reg_data;
10wire [7:0] int_data;
11
12// 逻辑描述
13always @(posedge clk or negedge reset) begin
14    if (~reset) begin
15        reg_data <= 8'b00000000; // 复位时寄存器清零
16    end else begin
17        reg_data <= data_in; // 在时钟上升沿时更新寄存器数据
18    end
19end
20
21assign data_out = reg_data; // 将寄存器数据赋值给输出端口
22
23endmodule

4. 逻辑描述

逻辑描述部分定义了模块内部的行为。这部分通常包括时序逻辑(使用 always 块)和组合逻辑(使用 assign 语句)。

时序逻辑

时序逻辑通常用于描述触发器和存储单元的行为,使用 always 块来描述。

 

verilog

深色版本

1always @(posedge clk or negedge reset) begin
2    if (~reset) begin
3        reg_data <= 8'b00000000; // 复位时寄存器清零
4    end else begin
5        reg_data <= data_in; // 在时钟上升沿时更新寄存器数据
6    end
7end

组合逻辑

组合逻辑用于描述没有记忆效应的逻辑,通常使用 assign 语句来描述。

 

verilog

深色版本

1assign data_out = reg_data; // 将寄存器数据赋值给输出端口

5. 敏感列表

always 块中,可以使用敏感列表(sensitivity list)来指定哪些信号变化会触发该块的执行。

 

verilog

深色版本

1always @(posedge clk or negedge reset) begin
2    if (~reset) begin
3        reg_data <= 8'b00000000; // 复位时寄存器清零
4    end else begin
5        reg_data <= data_in; // 在时钟上升沿时更新寄存器数据
6    end
7end

6. 任务和函数

任务(task)和函数(function)用于定义可复用的代码块。

任务(Task)

任务没有返回值,通常用于定义一系列操作。

 

verilog

深色版本

1task display_value;
2    input [7:0] value;
3    $display("Value: %b", value);
4endtask

函数(Function)

函数有返回值,通常用于定义计算结果。

 

verilog

深色版本

1function [7:0] increment;
2    input [7:0] value;
3    increment = value + 1;
4endfunction

7. 测试平台

在 Verilog HDL 中,通常会创建一个测试平台(testbench)来验证模块的行为。测试平台通常使用 initial 块来初始化信号,并使用 always 块来产生时钟信号。

 

verilog

深色版本

1module testbench;
2
3reg clk;
4reg reset;
5reg [7:0] data_in;
6wire [7:0] data_out;
7
8dff dff_instance (
9    .clk(clk),
10    .reset(reset),
11    .data_in(data_in),
12    .data_out(data_out)
13);
14
15initial begin
16    clk = 0;
17    forever #5 clk = ~clk;
18end
19
20initial begin
21    reset = 1;
22    #10 reset = 0;
23    
24    data_in = 8'b10101010;
25    #20;
26    
27    $display("Data Out: %b", data_out);
28    $finish;
29end
30
31endmodule

总结

Verilog HDL 的基本要素包括关键字、数据类型、模块定义、逻辑描述、敏感列表、任务和函数以及测试平台。通过这些基本要素,设计师可以使用高层次的语言来描述复杂的硬件系统,并利用综合和仿真工具将这些描述转化为实际的硬件实现。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值