tags
type
status
date
slug
summary
category
password
icon

#0 Verilog语法

iverilog

cmd命令:
iverilog -g2005-sv -o 1.out 1.v 把1.v输出为1.out,-sv是调用systemverilog
vvp -n 1.out -lxt2
gtkwave 1.vcd 查看波形
需要在1.v中添加命令:

数值

0低电平,1高电平,x/X未知,z/Z高阻
4'b1011,4表示bit数,‘DHBO表示基数,最后是数值
可以加入下划线,如32'h3022_c0de
负数在最前面加-
都写上长度和基数!不然会有意料之外的bug

数据类型

  • wire 导线节点,默认的变量类型。信号流向有方向性,因此只能用assign赋值一次
  • reg 寄存器,类似变量
  • vector wire或reg位宽大于1。
    • 定义reg [3:0] counter; 表示3-0(含)共4bit,且最高有效位为3。 如果定义reg [3:0] counter[3:0]; 则说明counter是4*4bit的数组。 要注意向量(packed/bus)reg[3:0]与数组(unpacked)counter[3:0]是不同的概念。向量作为一种数据类型可以整个赋值,比如counter[0]=4'hA
    • 引用counter[31-:8]counter[31:24]等价,其中31-/+表示从第31个bit开始递减/增,取几位
    • 合成 temp1 = {data1, data2};其中的常数必须给出长度。 temp2 = {32{1’b0}} 赋值32位0
    • 容易出错的赋值
      • 假设a是一个向量,直接进行b=a;会导致b默认为1bit的wire,从而出现bug。为防止这种情况出现,可以加上`default_nettype none
    • & a[3:0] 表示对向量各位进行与。
  • integer 位宽与编译器有关的有符号数(reg为无符号数)
  • time 通过$time获取当前仿真时间
  • parameter/localparam 常量

编译指令

`define `undef `include
`timescale time_unit/time_precision

注释

///* xxx */

赋值

wire的赋值:assign f=(~s&x1)|(x&x2); ~&|^分别代表非、与、或、异或。wire类型只能被赋值一次。注意这些都是bit-wise的运算符,对向量按位计算且结果也是向量,而&& ||等是逻辑运算符,结果是1bit的值。
reg的赋值:b=4'd10
多变量赋值:assign {o2, o1, o0} = vec;

时延

#x 延时x个time precision

过程结构

  • initial 每个initial语句都是独立的,从0时刻开始执行,只执行一次。多用于初始化、信号检测等
  • always @(*)Combinational.从0时刻开始执行,执行完最后一条后回到第一条。内部赋值采用阻塞赋值x=y
  • always @(posedge clk)Clocked.内部采用非阻塞赋值x<=y 。非阻塞赋值同时进行,且采用上一时刻的数据,其结果直到下一个时刻才会生效。如下面代码可以实现reg值的交换。
    • 注意所有always过程结构内部的赋值都不用assign ,只能对reg等赋值。除了组合逻辑电路,一般情况下不对wire赋值。

    分支

    • if和case必须包含在always块中,因此内部不能对wire赋值。对wire赋值可以采用 out = (sel == 0) ? a:b
    • casez中,当满足多个条件时,采用最前面那个。但最好的方式还是让输入无论如何都只满足一个条件,因此bzz10bzz1z更好。
    • 避免latch。如果在一个模块后,某个值没有被确定,那么verilog会自动继承其上一时刻的值,称为latch。除非有意为之,否则latch的警告很有可能是bug。 为避免latch,必须确保在任何情况下所有变量都被赋值 除了使用default之外,也可以在case前赋予默认值:

      循环

      • for的控制变量一般定义为integer,该变量只用于辅助生产代码,而在仿真时会消失。
      • generate的控制变量为genvar。for循环需要一个名字

      门级原始结构

      and(y,x1,x2)
      or(y,x1,x2,x3)
      not(y,x)

      模块

      • 实例化

      选择

      #1 Preface

      标准芯片、可编程逻辑芯片(PLD)与全定制芯片(ASIC)
      PLD的一种是FPGA,现场可编程门阵列
      CAD系统:Quartus/ISE

      #2 Introduction to Logic Circuits

      notion image
      notion image
      Analysis: network⇒function
      Synthesis: function⇒network

      Properties of Bool Algebra

      • Duality: and与or互换,0与1互换,等式仍然成立
      • Distribution law:
        • (from duality)
      • Absorption law:
      • Merge law:
      • De Morgan’s law:
      • Inclusion law:

      积之和&和之积

      积之和(SOP):所有f=1的项加起来,如 。如果每一项都是最小项,那么称为正则积之和
      和之积(POS):所有f=0的项的非乘起来,如。如果每一项都是最大项,那么称为正则和之积
      任何“或-与”电路可以用具有相同拓扑结构的“或非-与非”单路实现(p30)

      硬件描述语言(HDL)

      Verilog HDL或VHDL是通用的硬件描述语言。
      逻辑综合:把Verilog编译成逻辑电路
      功能仿真:验证零时延逻辑门能否实现功能
      时序仿真:考虑时延验证功能

      卡诺图

      注意4变量卡诺图除了左右边、上下边相邻,四个角也是相邻的
      5变量卡诺图由两张4变量卡诺图组成,对应位置都为1则可以消去x5
      对SOP形式,覆盖所有1;对POS形式,覆盖所有0。两种方法的消去变量的方法是一致的,下面均以SOP为例

      最小化策略

      • 字符:乘积里有几项就是几个字符
      • 蕴含项(Implicant):该项对应框内全是1
      • 质蕴含项/素项(Prime Implicant):不能被包含进字符数更少(框更大)的蕴含项中
      • 覆盖:所有框加起来盖住所有1
      • 成本:总逻辑门数量+所有逻辑门的输入数,并假定原始输入的非可以无成本获得
      • 基本质蕴涵项(Essential Prime Implicant):包含了一个最小项,该最小项不在其他质蕴涵项中。容易发现,基本质蕴涵项必须被包括在一个覆盖中

      无关项

      永远不会出现的输入的组合。可以根据方便任意的赋值为0或1,在卡诺图中用d表示

      多输出电路

      对多输出电路,由于部分电路可以共享,整体成本最小的方式可能不是让各自的成本都最小,以上寻找基本质蕴涵项的方法不成立

      #3 Calculation Circuits

      • 半加器
        • 本位,进位
      • 全加器
        • 加上前一位的进位
          notion image
          其中异或定义为,其本质上是和mod2
          异或门的另一个作用是:用信号x控制信号y
          另外同或:
          一个全加器可以用两个半加器构成
      • 补码
      [Top]Learning English through MoviesLatex