verilog 基础知识

  1. mealy型状态机的下一状态和输出取决于当前状态和当前输入;
  2. moore型状态机的下一状态和输出取决于当前状态和当前输入,但其输出仅取决于现在的状态;
  3. 基本门原语的输出端口必须写在端口列表的前面,基本门原语的例化名可选(可以没有名字);
  4. n输入原语:
  5. 标识符大小写敏感,由大小写字母、数字、下画线( _ )和$组成;·变量第一个字符只能是字母或下画线;
  6. 格式指示符对大小写不敏感(b, o, d, h);
  7. 除标识符以外,描述文本可以随意使用空格;
  8. 原语中不能有任何例化或嵌套;
  9. verilog矢量表示为vector[highest:lowest],表达式可以选取部分区间,若选择区间在原区间以外则返回未知量x;
  10. 常用的电路功能验证方法有:逻辑仿真(通过把激励波形加到电路中,监视仿真波形确定电路逻辑)与形式验证(通过复杂的数学论证来证明电路功能,用于大规模复杂电路);
  11. 所有线网类型在仿真开始阶段都赋值为z,除了trireg为x(与开关电平模型有关);
  12. 寄存器类型reg变量开始赋值为x;
  13.  ?在UDP中代表输入可以是0、1或者x;
  14. 时序UDP的输出必须声明为reg;
  15. verilog中的变量只有线网型和寄存器型两种,常用的为线网类型的wire和寄存器类型的reg和integer;
  16. wire和reg默认为1位变量;
  17. 位拼接运算符中如果出现常量,必须指定其位宽;
  18. verilog中integer大小自动取主机所支持的计算机字长,至少32位;
  19. assign定义了连续赋值;
  20. 过程语句中,操作符<=被称为过程赋值运算符;
  21. always语句块中,如果在给定的条件下变量没有赋值,你们这个变量将保持原值,也就是会生成一个锁存器;(如缺少default等)结构说明语句(procedural assignment)中进行赋值的左边式一定要是variable型(如 reg),连续赋值assign 声明中左边式的类型一定要是net型(如 wire);
    1. parameter 参数名1 = 表达式, 参数名2 = 表达式, ......  , 参数名n = 表达式;  (连续地对多个参数进行赋值时,中间用逗号,最后用分号)
  22. 赋值语句类型:在单向或周期性行为中由过程赋值操作符赋值的变量必须是一个已定义的寄存器型变量;
    1. Continuous assignments连续赋值语句assign;
    2. Procedural blocking assignment过程阻塞赋值语句always(*)  left = right;
    3. Procedural non-blocking assignment过程非阻塞赋值语句always@(posedge negedge ) left <= right;
  23. 寄存器变量在仿真期间暂存信息,但这不一定代表已综合电路中会包括硬件寄存器;
  24. Verilog语言允许在事件控制表达式中由电平敏感和边沿敏感的变量混用的情况,但是综合工具不支持这样的行为模型;
  25. 同步机的数据流模型也被称为RTL模型;
  26. 普通过程赋值操作(=), 语句按照顺序依次执行,并在任一语句执行后,下一语句执行前即时进行值的存储;
  27. 非阻塞赋值队列中的语句是并发执行的,而不取决于他们的相对次序;左边式是统一赋值的;
  28. 阻塞赋值(阻塞过程赋值语句)是依次执行的,前一句赋值完以后才执行下一句(包括左式的计算与右式的赋值);
  29. 信号x,z的默认宽度是机器的字节宽度,通常是32位;
  30. 连续赋值语句注意要点:repeat语句中表达式中值为x或者z,结果视为0;移位操作符>>&<<可以使用<<n对数据按指定位置移位n位,并且用0填补减少方向的位数;函数function必须至少有一个输入自变量,但是不可能声明任何的output和inout端口(自变量);
    1. 赋值目标只能是线网类型(wire);
    2. 在连续赋值中,只要赋值语句右边表达式任一变量发生变化,表达式立即被计算,计算的结果立即赋值给左边信号(若没有定义延时量);
    3. 连续赋值语句不能出现在过程块中(initial和always);
    4. 多个连续赋值语句之间是并行语句,因此与位置顺序无关;
    5. 连续赋值语句中的延时具有硬件电路中惯性延时的特征,任何小于其延时的信号变化脉冲都将被滤除掉,不会提现在输出端口上;
  31. reg [word_size-1:0]   储存器名[num-1:0] 代表定义了一个有num个word_size位的储存器,看夏宇闻变量memory型 pp34
  32. case语句必须放在过程块里;
  33. if_else 条件语句:case语句可以嵌套;case、casez与casex之间的异同:
    1. 条件语句必须在过程块(initial or always)中使用,除了在这两种块语句引导的begin_end块中可以编写条件语句外,模块中的其他部分都不能编写
    2. if语句分为:if、if_else、 if_else if_else三种;
    3. if_else & if_else if_else中每个else前面的语句需要以“;”结尾, 整个语句结束后要用“;”结尾;
    4. if后的表达为一般为逻辑表达式 | 关系表达式, 其中0, z, x按 “False” 处理, 1按“True”处理;
    5. if & else后的语句如果为一个以上语句需要用begin_end包裹成复合块语句;
    6. if语句允许嵌套(可综合?)
    7. if与else具有配对关系,else总与上面最近的if配对,如果if与else的数目不是一一对应,用begin_end包裹,否则可能会改变逻辑行为;
  34. 如果变量定义了位宽,例如reg [5:3] name;则变量name的index从3开始而非从0开始; 
  35. 块语句不允许套用,至少always不行,vivado会报错;
  36.  
    case    
    casez    
    casex    
  37. 0不影响异或计算的结果,1不影响同或计算结果;
  38. 向SRAM写数据:先建立地址和数据,后置位写有效信号;写有效信号保持一段时间后先复位,再释放地址总线和数据总线。
  39. 从SRAM读数据:先建立地址,然后置位读使能信号有效,保持一段时间后复位,同时读取数据总线上的值,然后释放地址总线
  40. function中不能包含非阻塞赋值
posted @ 2019-11-24 09:40  Pent°  阅读(835)  评论(0编辑  收藏  举报