Open phymo opened 2 years ago
字母,_,数字,$
0,1,x,z
3'b001
reg [3:0] a;
一般无符号reg[7:0] mem[255:0]
// TODO: 运算符表格 (优先级和功能)
算数运算符: + - * / %
; 代表了实际电路,如加法器等;注意结果的位数,是否会截断结果;
>, <, >=, <=
, 输出为1或者0
; x
与1或者0
比较结果为x
==
, !=
, 全等===
, !==
,
区别:全等可以比较
x
和z
而且关注位宽 但是 相等更常用
关系 => 数字比较器
// TODO: 真值表
&&, ||, !
, 输出为一位
如果操作符中有x, 结果为x 逻辑非 => 或门 + 非门
&, | , ~, ^, ^~
&, | , ~, ^
及非, 对数据所有位一起操作>>
<<
, 位数不变,空位补零 (不重要)a ? b : c
三目运算符 , 硬件电路为二选一数据选择器{ a, b }
, {3{ a }}
没有电路,重新定义和命名,拼接信号基本功能模块
module name(port list) ... endmodule
- 端口定义
- 模块引用时端口的对应方式
语法:只有一条语句
assign
与运算符结合使用; 可以描述所有的组合电路1. 连续赋值语句:对组合电路的基本描述
- 目标必须是线网类型(wire): 标量线网和向量线网
- 方式:显示(推荐)和隐式(不推荐)
- 不能出现在过程块中间
- 多个连续赋值语句是并行的
- 会有硬件电路延时,小于延时的变化脉冲会被过滤掉。 (惯性延迟?)
两种过程语句: initial
不可综合, always
可综合
initial
begin
// 语句块
end
always@(敏感事件列表)
//语句块
- 可以描述组合电路和时序电路, 如果组合电路,所有信号写入敏感事件表
- 对于时序电路,需要把clk和部分相关信号写入敏感事件表
$finish
结束
- reg vs wire 在过程语句中组合电路描述时:
- 数据流 用wire
- 行为描述 用 reg
语句块:串行, 并行
过程赋值语句: assign, =, <=, 主要用于串行代码块
b = a
阻塞赋值语句, 先计算右边,延迟结束赋值?串行b <= a
非阻塞赋值语句,先计算右边,立即赋值?流水线设计(拆分组合电路,加寄存器)条件分支语句(可综合 - 数据选择器): if, case
循环语句:很少可综合 ( 少用)
卡诺图/有限状态机 已经被EDA 取代
$random % b
-b 到b的随机数#2 sum = a + b;
; 内部延迟控制a = #5b;
fork ... join
a=#5
(相对时间)a<=#5
(绝对时间)虽然在begin end
里面,但是仍是并行的task name ... end task
与模块的区别,没有实例,每一个模块是独立与其他模块的,任务写在模块里面,只能调用模块内的任务
function 返回类型或位宽 函数名;
输入参数 // 至少有一个输入端口
局部变量说明
foerever #(clk_period/2) clk = ~clk
always # (clk_period/2) clk = ~clk
(always 不加敏感信号表,就会一直循环执行)#( dA, dB, dC)
#(d_min: d_typ: d_max)
与上面一起共1~9个值
(a=>out) = (8,9,10)
(a,b *>out) = 9;
There are three types of assignments in Verilog:
https://www.bilibili.com/video/BV12y4y1v7V3?vd_source=9fe1c020c4b9fcfff5f8417a69f07f6c https://hdlbits.01xz.net/wiki/Main_Page https://www.edaplayground.com/playgrounds