Verilog语法总结
1、整数 integer
-
整数(正数 0 负数)是一种通用的寄存器数据类型,用于对数量进行操作,整数的默认位宽为宿主机的字的位数,与具体实现有关,最小为32位。
-
reg和integer:reg的寄存器类型变量为无符号数
integer的寄存器类型变量为有符号数 -
举例:
integer counter; //作为计数器定义 initial counter = -1; //将-1存储到计数器中 //说明:counter[8] 和 counter[16:2]是非法的
2、函数:关键字 function-----endfunction
使用函数的前提条件:
- 子程序内不含有延迟、时序或者控制结构
- 子程序只有一个返回值
- 至少有一个输入变量
- 没有输出或者双向变量
- 不含有非阻塞赋值语句
说明:
举例:
module fun (
input integer i_in,
output [8:0] o_out
);
//定义一个计算二进制位宽的函数---可以用来计算模块中地址总线的宽度
function [8:0] clogb2;
input bit_depth ;
integer bit_depth ;
begin
for(clogb2 = 0; bit_depth > 0; clogb2 = clogb2 + 1)
bit_depth = bit_depth >> 1;
end
endfunction
assign o_out = clogb2(i_in); //函数的调用:指明函数名clogb2()和输入变量 i_in
endmodule
3、任务:关键字 task-----endtask
4、编译指令--形式:`keyword
(1)`timescale
用法: `timescale <reference_time_unit>/<time_precision>
说明: <reference_time_unit> (参考时间单位):指定时间和延迟的测量单位。
<time_precision>(时间精度):指定仿真过程中延迟值进位取整的精度。
只有1,10,100才是合法的说明时间单位和时间精度的整数。
举例:
`timescale 1ns / 1ps
#10 表示延迟10ns
#6.231678 因为精度为1ps,在6.232时赋值语句生效
(2)`define
说明: 定义Verilog中的文本宏,类似C语言中的#define
举例:
a. 规定子长的文本宏: `define WORD_SIZE 32 //代码中用`WORD_SIZE表示
b. 定义别名: `define S $stop //代码中用`S来代替$stop
c.定义字符串: `define WORD_REG reg [31:0] //用`WORD_REG reg 32来定义一个32位的寄存器变量
(3)`include
说明: 可以在编译期间将一个Verilog源文件包含在另一个Verilog文件中,作用类似于C语言中的#include结构
举例:
可以提前将VGA数据,比如颜色的数据存放在一个源文件中(起名为VGA_Para.v或者VGA_Para.h)在VGA的driver和display模块可以直接调用这个文件VGA_Para.v
`include "VGA_Para.v"
module VGA_Dispaly(
port1,
port2
);
endmodule
(4)`ifdef--条件编译
说明: 条件编译指令可以根据指定条件来生成对应的电路,可以减少电路面积并提高代码的复用性。
用法: 在Verilog文件中,条件编译标志可以用`define语句设置。
举例一:有条件的编译模块
`ifdef XOR //若设置NOR标志,则编译design_xor模块
module design_xor;
······
endmodule
`elsif AND //若设置AND标志,则编译design_and模块
module design_and;
······
endmodule
`else //默认执行design_or模块
module design_or;
······
endmodule
`endif
举例二:有条件的编译语句
`define XOR //执行该语句
//`define AND
//`define OR
module test(
input i_data_a,
input i_data_b,
output o_data_result
);
`ifdef XOR
assign o_data_result = i_data_a ^ i_data_b;
`elsif AND
assign o_data_result = i_data_a & i_data_b;
`else
assign o_data_result = i_data_a | i_data_b;
`endif
endmodule
举例三:`ifndef的用法
它的作用和`ifdef 是相反的----当其后的标识符未被定义时,则编译后续的代码段
//`define XOR //注释掉,相当于标识符未被定义
module test(
input i_data_a,
input i_data_b,
output o_data_result
);
`ifndef XOR
assign o_data_result = i_data_a ^ i_data_b; //XOR未被定义,执行该语句
`else
assign o_data_result = i_data_a | i_data_b;
`endif
endmodule
5、系统任务--形式:$keyword
(1)$display
用法: $display(P1,P2,P3,.....,Pn);
说明: P1,P2,P3,.....,Pn是双引号括起来的 字符串,变量或者表达式;同时$display会自动在字符串的结尾处插入一个换行符。
举例:
$display("Hello Verilog"); //显示小括号中的字符串
$display($time); //显示当前仿真时间
reg[0:40] virtual_addr;//在时间为200的时刻,显示41位虚拟地址1fe0000001c
$display("At time %d virtual address is %h", $time, virtual_addr);
---显示为:At time 200 virtual address is 1fe0000001c
$display("ID of the port is %d", port_id); //二进制数显示port_id 5
---显示为:ID of the port is 00101
字符串格式说明:
格式 | 显示 |
---|---|
%d或%D | 用十进制显示变量 |
%b或%B | 用二进制显示变量 |
%s或%S | 显示字符串 |
%h或%H | 用十六进制显示变量 |
%c或%C | 显示ASCII字符 |
%m或%M | 显示层次名 |
%v或%V | 显示强度 |
%o或%O | 用八进制显示变量 |
%t或%T | 显示当前时间格式 |
%e或%E | 用科学计数法格式显示实数(如3e10) |
%f或%F | 用十进制浮点数格式显示实数 |
%g或%G | 用科学计数法或十进制格式显示实数,显示较短的格式 |
(2)$stop
用法: $stop;
说明:$stop 暂停仿真,使仿真进入一种交互模式,设计者可以在此模式下对设计进行调试
(3)$finish
用法: $finish;
说明:$finish 结束仿真,会直接将仿真界面关闭
该博客为博主记录学习所用,如有错误,请评判指正。博客内容大多来自《Verilog HDL数字设计与综合(第二版)》 -夏宇闻译
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人