gaochy1126 发表于 2022-7-31 21:18

Verilog HDL | 简介与基本语法

1 Verilog简介(Verilog语法学习者可跳过该节)Verilog是一门类C语言Verilog是一门类C语言,语法与C接近,但Verilog是硬件设计语言,与C实质不同。
[*]Verilog代码对应硬件实体。比如在Verilog里写的a+b,最后会得到由硬件实现的加法器
[*]Verilog代码到硬件的过程叫综合。综合就是将Verilog代码转化为硬件实现
[*]Verilog并行执行
HDL: Hardware Description Language




Verilog HDL使硬件设计师们得以专注于逻辑,而不需要考虑硬件层面的实现。同样的代码只要经过不同的库综合,就可以在不同的硬件上运行。因此Verilog的代码具有极高的可复用性。
使用Verilog的绝大多数开发都处于寄存器传输级。


软核、固核与硬核
[*]软核(Softcore):功能经过验证的、可综合的、实现后电路结构总门数在5000门以上的Verilog HDL模型。
[*]固核:在某一种现场可编程门阵列(FPGA)器件上实现的,经验证是正确的总门数在5000以上的电路结构编码文件。
[*]硬核:在某一种专用的半导体集成工艺(ASIC)的器件上实现的,经验证是正确的总门数在5000以上的电路结构掩膜
显然,在具体实现手段和工艺技术尚未确定的逻辑设计阶段,软核具有最大的灵活性。因此,发展软核的设计和推广软核的重用技术是非常有必要的。

链接:https://www.jianshu.com/p/9c3515d4d1da



gaochy1126 发表于 2022-7-31 21:19

自顶向下(Top-Down)设计(对上图的讲解:P2 | 2:55)
2 Verilog基本语法Verilog语法概述行为级描述/寄存器传输级(RTL)描述/系统级描述:把module当成黑盒,描述module输入与输出的关系。门级实现由综合工具推断,常常能做到最优。结构级描述/门级描述:把module作为白盒,而描述组成module的门电路(部件)

gaochy1126 发表于 2022-7-31 21:19

基本语法
[*]Verilog区分大小写
[*]Verilog的关键字都是小写
[*]module, endmodule定义一个基本模块,两个关键字间的语句是对该模块的描述。定义模块方便复用。
[*]parameter关键字定义一个参数,增强模块的通用性
[*]output, input关键字指定输入输出
[*]always @(posedge/negedge clk)语句,每当clk出现上升/下降沿时,就执行接下来的语句块(begin, end标志一个语句块)。这种语句构成时序逻辑,当前输出与上一个时刻的值有关
[*]reg类的变量用<=赋值,赋值符号左侧是寄存器,右侧是更新的值
[*]&q语句输出q每一位相与的结果,即&q=q&q&...&q
[*]assign关键字描述组合逻辑,输出只与当前输入有关
[*]input/output如果没有显示声明类型,默认为wire类型。如果需要reg类型以存储值,需要显示声明
[*]wire类型只是一根导线,只能用来组合逻辑。assign语句等号右侧一旦发生变化,等号左侧立刻得到结果;而always语句块中的值改变只能发生在每一时刻(由@符号后的语句描述时刻)
[*]initial begin, end语句块指明初始化语句,这部分指令在系统上电后直接执行
[*]'timescale 1ns/1ps指定测试的单位是1ns,精度是1ps
[*]#100指令指明延时,单位由之前的代码指定
[*]$stop指令使仿真停止
[*]时序逻辑:<=赋值;组合逻辑:-赋值








代码实例






gaochy1126 发表于 2022-7-31 21:20

数据类型及常量、变量语法:<位宽>'<进制><数值>
[*]位宽:对应二进制的宽度
[*]进制



进制表示

有两种类型:
[*]nets type
[*]register type

[*]nets type





上表的后面三种类型不可以综合,主要用在算法级的开发注:==和===的区别在于怎么处理z和x的位。一般来说用==就足够了




优先级






gaochy1126 发表于 2022-7-31 21:20

【重要】语句
Part 0 概述
赋值语句
连续赋值语句:assign语句
过程赋值语句:always开头,@引导一个敏感列表
条件语句
if-else
case
(条件语句必须在顺序执行块中使用。所谓顺序执行块是指由 initial 和always语句引导的执行语句集合。除了这两种语句引导的begin_end块中可以编写条件语句外,模块中的其他地方都不能编写。)

循环语句
forever
repeat
while
for
结构说明语句
initial
always
task
function
编译预处理语句
`define语句
`include语句
`timescale语句

gaochy1126 发表于 2022-7-31 21:20

Part 1 赋值、条件语句详解
always过程块

always @(<敏感信号表达式>)
begin
...
end
always语句块不能嵌套
在敏感信号表达式前加posedge或negedge关键字可以指定上升沿或下降沿触发。否则每当表达式的值发生改变,就会执行语句块
initial过程块

initial过程块模拟上电之后的行为,不可综合,通常用于功能模拟的初始化,写在测试文件(testbench)中
同一模块中的initial过程块,在上电时并行执行
initial过程块不能嵌套
连续赋值语句assign

assign语句常用于对wire类型变量进行赋值
等式左边的wire变量随等式右边的值一起变化
过程赋值语句

常用于对reg型变量进行赋值
阻塞赋值(=)与非阻塞赋值(<=)




页: [1]
查看完整版本: Verilog HDL | 简介与基本语法