phymooc / learn-digital-IC

0 stars 0 forks source link

Verilog #2

Open phymo opened 2 years ago

phymo commented 2 years ago

https://www.bilibili.com/video/BV12y4y1v7V3?vd_source=9fe1c020c4b9fcfff5f8417a69f07f6c https://hdlbits.01xz.net/wiki/Main_Page https://www.edaplayground.com/playgrounds

phymo commented 2 years ago

数据类型

  1. 空白符
  2. 注释
  3. 标识符: 大小写敏感, 字母,_,数字,$
  4. 关键字
  5. 数值:0,1,x,z
  6. 整数及其表示: 二进制,八进制,十进制,十六进制; 负数:补码; size: 数据线的数量,bit;3'b001
  7. 小数的表示:整数部分和小数部分分开, 定点小数和浮点小数
  8. 实数表示: 十进制表示法,科学计数法
  9. 物理数据类型:
    1. 连线型数据类型:wire/tri(常用), wor/trior, wand/trand, trireg, tri1, tri0, supply1, supply0 +(电流能力,电流驱动强度) 1 supply 2 strong 3 pull 4 large 5 weak 6 medium 7 small 8 highz
    2. 寄存器类型:reg; reg [3:0] a; 一般无符号
    3. 存储器类型:RAM型,ROM型,reg[7:0] mem[255:0]
  10. 抽象数据类型:integer, time, real, parameter
phymo commented 2 years ago

运算符和表达式

// TODO: 运算符表格 (优先级和功能)

  1. 算数运算符: + - * / %; 代表了实际电路,如加法器等;注意结果的位数,是否会截断结果;

    • 加法减法电路可以直接综合
    • 乘法,可以直接生成乘法器
    • 除法和取模,EDA工具支持不好,需要专用库
      1. 关系操作符: >, <, >=, <=, 输出为1或者0; x1或者0比较结果为x
      2. 相等关系运算符:相等==, !=, 全等===, !==

        区别:全等可以比较xz而且关注位宽 但是 相等更常用
        关系 => 数字比较器

    // TODO: 真值表

  2. 逻辑运算符:&&, ||, !, 输出为一位

    如果操作符中有x, 结果为x 逻辑非 => 或门 + 非门

  3. 按位操作符:&, | , ~, ^, ^~
  4. 规约操作符(缩位运算符):单目运算符 &, | , ~, ^ 及非, 对数据所有位一起操作
  5. 移位运算符: >> <<, 位数不变,空位补零 (不重要)
  6. 条件运算符:a ? b : c 三目运算符 , 硬件电路为二选一数据选择器
  7. 连接和复制运算符(重要):{ a, b }, {3{ a }} 没有电路,重新定义和命名,拼接信号

模块的基本概念

基本功能模块

module name(port list)
...
endmodule
  1. 端口定义
  2. 模块引用时端口的对应方式
phymo commented 2 years ago

建模

1. 数据流建模

语法:只有一条语句 assign 与运算符结合使用; 可以描述所有的组合电路

1. 连续赋值语句:对组合电路的基本描述

  1. 目标必须是线网类型(wire): 标量线网和向量线网
  2. 方式:显示(推荐)和隐式(不推荐)
  3. 不能出现在过程块中间
  4. 多个连续赋值语句是并行的
  5. 会有硬件电路延时,小于延时的变化脉冲会被过滤掉。 (惯性延迟?)
phymo commented 2 years ago

2. 行为级建模

  1. 两种过程语句: initial 不可综合, always 可综合

    • initial: 主要用于仿真和测试的激励信号产生,不可综合
      initial
        begin
           // 语句块
        end
    • always:敏感事件列表,(没有与的概念, 有OR的概念)
    always@(敏感事件列表)
       //语句块
    
    1. 可以描述组合电路和时序电路, 如果组合电路,所有信号写入敏感事件表
    2. 对于时序电路,需要把clk和部分相关信号写入敏感事件表 $finish 结束
      • reg vs wire 在过程语句中组合电路描述时:
      • 数据流 用wire
      • 行为描述 用 reg
  2. 语句块:串行, 并行

    • 串行, begin-end 可综合, 从零开始 相对延迟
    • 并行, fork-join 主要用于验证,从零开始 绝对延迟
  3. 过程赋值语句: assign, =, <=, 主要用于串行代码块

    • b = a 阻塞赋值语句, 先计算右边,延迟结束赋值?串行
    • b <= a 非阻塞赋值语句,先计算右边,立即赋值?流水线设计(拆分组合电路,加寄存器)
    • 过程连续赋值语句: assign, deassign, force, release. 不可综合 常用于调试
  4. 条件分支语句(可综合 - 数据选择器): if, case

    • if, else if, else
    • case/casez/casex 处理 0/1/x/z
  5. 循环语句:很少可综合 ( 少用)

    • forever : 产生 时钟
    • repeat
    • while
    • for
phymo commented 2 years ago

3. 结构化建模

phymo commented 1 year ago

设计方法

组合电路设计

phymo commented 1 year ago

时序电路设计

phymo commented 1 year ago

有限同步状态机 (功能强大,但不提倡使用)

phymo commented 1 year ago

测试与仿真 (验证)(可以不考虑可综合性)

phymo commented 1 year ago

信号时间赋值语句

phymo commented 1 year ago

任务和函数

phymo commented 1 year ago

典型测试向量的设计

  1. 初始化
    • initial初始化 :只执行一次,变量必须是 reg类型
    • 隐式初始化:定义时直接初始化
  2. 数据信号测试向量的产生
    • 可以在initial语句中产生: 不规则信号
    • 也可以在always语句中产生: 规则或者循环信号
  3. 时钟信号测试向量的产生(重要)
    • 基于initial语句: foerever #(clk_period/2) clk = ~clk
    • 基于always语句: always # (clk_period/2) clk = ~clk (always 不加敏感信号表,就会一直循环执行)
    • 眼图?时钟信号采样位置:对时钟信号进行相位偏移,使其采样在眼图的中间位置
  4. 总线信号测试向量的产生 (非常重要)AMBA总线
    • 总线是运算部件之间的数据流通的公共通道,总线频率一般是内核芯片频率的一半或者1/4
    • AHB总线:低速总线
  5. 对于VLSI, 计算机生成VCD 文件,从而产生测试信号
phymo commented 1 year ago

用户自定义元件 (UDP) (很少用了)

phymo commented 1 year ago

基本门级原件和模块的延时建模 (重要)

门级延时

  1. 门级延迟 #( dA, dB, dC)
    • 上升延迟 dA
    • 下降延迟 dB
    • 到不定态的延迟 min(dA, dB, dC)
    • 截止延迟 dC
  2. 门级延迟 最小,典型,最大延时的表达形式 #(d_min: d_typ: d_max) 与上面一起共1~9个值

    模块级延时

  3. specify endspecify, 包含路径延迟语句(a=>out) = (8,9,10)
  4. 并行
  5. 全连接:(a,b *>out) = 9;
  6. specparam 声明语句:声明specify语句中的参数
  7. specparam vs parameter
  8. 与时序检查相关的系统任务(重要)
    • $setup(data_event, reference, limit): setup time 时间检测, (高速电路容易遇到)
    • $hold(reference_event, data_event, limit): hold time 时间检测,
    • ...

      编译预处理

  9. `define, undef
  10. `include
  11. `timescale 1ns/1ps: 单位 和 精度
  12. ...

verilog HDL 测试方法

  1. 完全测试法:
    • 语句覆盖率
    • 路径覆盖率
    • 状态机覆盖率
    • 触发覆盖率
    • 表达式覆盖率
  2. 随机测试法
  3. 自动测试法
phymo commented 1 year ago

数字电路系统设计 (层次化描述)

phymo commented 1 year ago

EDA 工具

  1. modelsim: project, object, wave, data flow.
phymo commented 1 year ago

There are three types of assignments in Verilog: