入职前重学Verilog hdl

使用书籍:Verilog 数字系统设计教程,夏宇闻版;
主要第1、2、3、4、5(5.1-6)、6、7(7.7)章。
第一章:基础知识
语言发展;自顶向下的设计(Top_Down);
第二章:语法
系统级(system-level),算法级(algorithm-level),RTL级(register transfer level),门级(gate-level),开关级(switch-level);;;
注释// //…;;;
除了endmodule,每个语句和定义最后必须有分号;;;
第三章:模块结构,数据类型,变量和运算符号
always模块内顺序执行,外同时执行;;;
过程块(initial块、always块),连续赋值语句,实例引用是并行的;三者出现的先后秩序没有关系;只有后两者可以独立于过程块;;;
共有19种数据类型;4个基本数据类型,reg wire integer parameter;;;
整数表达:<位宽><进制><数字> 8’ha2;负数表达: -8’d5;;;
当常量不说明位数时,默认值是32位,每个字母用8位的ASCII值表示,例10 = 32’d10 = 32’b1010 ;
-1 = -32’d1 = 32’hFFFFFFFF ; “AB” = 16’B01000001_01000010 //字符串AB,为十六进制数16’h4142;;;
参数(parameter)型常量:

module Decode(A,F);
  parameter  Width = 1,Polarity = 1;
  ...
endmodule
module Top;
  wire [3:0] A4;
  wire [4:0] A5;
  wire [15:0] F16;
  wire [31:0] F32;
  Decode #(4,0) D1(A4,F16);
  Decode #(5) D2(A5,F32);
endmodule

多层次模块构成的电路

'include "Top.v"
'include "Block.v"
'include "Annotate.v"
module Test;
  wire W;
  Top T();
endmodule
module Top;
  wire W;
  Block B1();
  Block B2();
endmodule
module Block;
  Parameter P = 0;
module
module Annotate;
  defparam
    Test.T.B1.P = 2,
    Test.T.B2.P = 3;
endmodule

reg型变量:当reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值,一个4位寄存器用做表达式中的操作数时如果开始被赋值-1,进行运算时认为是+15;reg型信号常常是寄存器或触发器的输出,但并不是说一定是;;;
memory 型变量:寄存器组;;;
算术运算符:进行整数除法运算时,结果值要略去小数部分,只取整数部分;而进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位,例11%-3 = 2, -10%3 = -1;如果有一个操作数为不定值x,结果也为x;;;
位运算符:~ 按位取反,&按位与,|按位或,^按位异或, ^~按位同或;当不同长度的数据进行位运算时,会自动将两者右端对齐,位数少的操作数会在相应的高位补满0;;;
第四章:运算符、赋值语句、结构说明语句
3种逻辑运算符:&& , || , !;4种关系运算符:< , > , <= , >=;4种等式运算符:== , != , === , !==;求反号、双等号、三个等号之间不能有空格;;;
2种移位运算符:a>>n , a<<n ;两种都用0填补移出的空位;;;
位拼接运算符:{} Concatation;在位拼接表达式中不允许存在没有指明位数的信号;可重复:{4{w}};可嵌套:{b,{3{a,b}}};;;
缩减运算符,单目运算法,结果是1bit二进制数;;;
?:是最低优先级别;;;! , ~是最高优先级别;;;
赋值语句:非阻塞(Non_Blocking)赋值,b<=a;1在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;2块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;3在编写可综合的时序逻辑模块时,这是最常用的赋值方法;;;
阻塞(blocking)赋值:b=a;1赋值语句执行完后,块才结束;2b的值在赋值语句执行完后立刻就改变的;3在时序逻辑中使用时,可能会产生意想不到的结果;;;
块语句:begin_end语句为顺序块;fork_join语句为并行块;;;
顺序块:1块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行;2每条语句的延迟时间是相对于前一条语句的仿真时间而言的;3直到最后一条语句执行完,程序流程控制才跳出该语句块(除了带有内嵌延迟控制的非阻塞赋值语句);;;
并行块:1块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行;2块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的;3延迟时间是用来给赋值语句提供执行时序的;4当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块;;;
块名:只需将名字加在关键词begin或fork后面即可;1可以在块内定义局部变量,即只在块内使用的变量;2可以允许块被其他语句调用,如disable语句;3在语言里所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量内的值;;;
第五章:条件语句、循环语句、块语句与生成语句
条件语句:if_else语句,必须在initial和always过程块语句中使用;;;
case语句注意case、casex和casez的区别;其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况;;;
锁存器:当always @ (al or d) 中if之后没有对应的else会生成锁存器,即当if不成立时保持原值,即锁存;当always @ (al or d) 中的case语句没有default时,不满足条件会保持原值,生成锁存器;;;
4种循环语句:forever语句、repeat语句、while语句、for语句;;;
生成块:generate-endgenerate,循环生成语句,条件生成语句,case生成语句;;;
第六章:结构语句、系统任务、函数语句和显示系统任务
4种结构说明语句:initial说明语句、always说明语句、task说明语句、function说明语句;;;
一个模块中可以有多个initial块,都是并行运行的;;;
task和function说明语句的不同点:1函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;2函数不能启动任务,而任务能启动其他任务和函数;3函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;4函数返回一个值,而任务则不返回值;;;
任务调用:my_task(a,b,c,d,e);

task my_task; //任务名
  input a,b;
  inout c;
  output d,e;
  ...
  ...
  c = foo1;
  d = foo2;
  e = foo3;
endtask

函数调用:word = getbyte(address);

function [7:0] getbyte;  //返回值的类型或范围   函数名
  input [15:0] address;
  begin
  ...
    getbyte = result_expression;
  end
endfunction

函数的使用规则:1函数的定义不能包含有任何的时间控制语句,即任何用#、@或wait来标识的语句;2函数不能启动任务;3定义函数时至少要有一个输入变量;4在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字;;;
自动(递归)函数,automatic;;;
常量函数;function integer clogb2 ( input integer depth);;;;
带符号函数;function signed [63:0] compute_signed (input [63:0] vector);;;;
常用的系统任务:$display(p1,p2,…,pn); $write(p1,p2,…,pn);
第七章:调试用系统任务和常用编译预处理语句
7.7编译预处理:

宏定义 `define 标识符(宏名) 字符串(宏内容);;;

`define WORDSIZE 8
module
  reg [1:`WORDSIZE] data;

“文件包含”处理 `include “文件名”;;;

时间尺度 `timescale <时间单位>/<时间精度> ;;;

条件编译命令:

`ifdef  宏名(标识符)
程序段1
`else
程序段2
`endif
module top;
bus_master b1(); //无条件地调用模块
`ifdef ADD_B2
  bus_master b2();  //有条件调用
`elsif ADD_B3
  bus_master b3();  //有条件调用
`else
  bus_master b4();  //有条件调用
`endif

`ifndef IGNORE_B5
  bus_master b5();  //有条件调用
endmodule

条件执行;;;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值