verilog学习笔记

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
条件运算符 ?:
位运算符 ~ | ^ & ^~ // 除~单目,为双目 移位运算符 << >> 拼接运算符 {}
单目运算符:带一个操作数,放置运算符右边 双目运算符:带两个操作数,放置运算符两边
三目运算符: r = s ? t :u
在硬件电路中信号有四种状态 0, 1, x, z 不同长度的数据进行位运算时,右端对齐,较小位数操作数高端填充 0
eg;{4{w}} = {w,w,w,w} / {b,{3{a,b}}} = {b,a,b,a,b,a,b} // 4,3 必须是常数表达式
缩减运算符: 单目运算符,具有与或非运算规则
运算法则:第一步先将操作数的第 1 位与第 2 位进行 与或非 运算,第二步先将操作数的第 2
位与第 3 位进行 与或非 运算,......
eg: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) // Wieth = 4,Polarity = 0 Decode #(5) D1(A4,F16) // Wieth = 5,Polarity = 1
reg[n-1:0] / reg mema[n-1:0] 不同 eg;reg[wordsize - 1:0] mem[memsize - 1] ,writerreg,readreg; writerreg = 0; / men[3] = 0; //第三个存储单元赋值为 0
运算符:
算术运算符 + - x / % 赋值运算符 = <= 关系运算符 > < >= <= 逻辑运算符 && || !
间是用来给赋值语句提供执行时序的
fork 语句 1; 语句 2; . . . 语句 n;
join // fork:块名 、//声明语句可以是参数声明语句、reg、interger、real、time、事件 event
语句 1; 语句 2; . . . 语句 n; join
块名: // 块内定义局部变量,允许块被其他语句调用/disable,静态变量/所有的变量只有一
输入口: input[信号位宽-1:0] 端口名 1; 输出口: output[信号位宽-1:0] 端口名 2; 输入/输出端口: inout[信号位宽-1:0] 端口名 3 I/O 说明写在端口声明中:
module module_name(input port1,ouput port2,inout port3);
整数四种进制表示;
二进制/b/B 八进制/o/O 十进制/d/D 十六进制/h/H
三种表示方式:
<位宽>‘<进制><数字> // 3'b001 ‘<进制><数字> //默认位宽,由具体的机器决定,至少是 32 位 <数字> //默认位宽和进制(十进制) eg;4 位二进制数的位宽是 44 位十六进制数的位宽是 16 x,z x 代表不定值,z 代表高阻值,z 可写作?//提高程序可读性 制,8 进制表示 3 位二进制,二进制中一位
wire [7:0] b; // 1 个 8 位的 wire 数据 wire [4:1] c,d; //2 个 4 位的 wire 数据
reg: 寄存器数据类型关键字,默认初始值为 x/一位, 通常用来表示 always 模块内的指定信号,通
过行为描述语句表达逻辑关系
always 模块内每一个信号必须定义为 reg 型 reg[n-1:0]/[n:1] 数据名 1,数据名 2,...... reg 数据是一个表达式中的操作数时,它的值被当做无符号值,即正值
assign、时例元件、always 块 是同时执行的,相当于并发运行的,顺序不会影响实现的功能
四种最基本的数据类型:reg、wire、integer、parameter //其他类型; large、medium、scalared、time、small、tri、trio、tril、triand、trior、trireg、vectored、wand、w or
eg; reg [3:0] B; reg c;
c = &B;
相当于 c = ((B[0] & B[1]) & B[2] ) & B[3]
优先级别:
! ~ -> * / % -> + - -> >> << -> < <= > >= -> == !== === !=== -> & -> ^ ^~
-> | -> && -> || ?:
对存储器进行地址索引的表达式必须是常数表达式
对于同一数据类型声明。可以同时定义存储器类型和 reg 类型 eg;parameter wordsize = 16, memsize = 256; reg[wordsize - 1:0] mem[memsize - 1],writerreg,readreg;
endmodule
module Top; wire W; Block B1(); Block B2();
endmodule
module Block; parameter P = 0; // --
endmodule
module Annotate; defparam Tset.T.B1.P = 2; // -- = 2 Tset.T.B2.P = 3; // -- = 3
关键词: MD 太多了,不想记!!!!
赋值语句:
非阻塞
不能立即为下面的语句所用,块结束才能完成这次赋值操作,而所赋的变量值是上一次赋 值得到的,时序逻辑电路常用
非阻塞赋值符号 <=
阻塞
时序逻辑电路赋值会得到意想不到的结果
块语句: 多条语句组合在一起,更像是一条语句
begin_end // 顺序执行,顺序块 / fork_join // 并行执行,并行块
casez(表达式) <case 分支> endcase
casex(表达式) <case 分支> endcase
case(sele)
16'b2: reu = 10'd9
16'b3: reu = 10'd3
16'b5: reu = 10'd1 default: reu = 10'd5
endcase
casez 处理不考虑高阻值 z 的比较过程,casex 则将高阻值 z 和不定值 x 都视为不关心的情况
位拼接运算符: 把多个信号的某些位拼接起来进行位操作
{信号 1 的某几位,信号 2 的某几位,信号 3 的某几位,......信号 n 的某几位}
eg;{a,b[3:0],w,3'b101} = {a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
不允许存在没有指明位数的信号
运算符、赋值语句和结构说明语句
逻辑运算符:
&& 逻辑与 || 逻辑或 !逻辑非
&& || 优先级低于关系运算符 !优先级高于算术运算符 关系运算符优先级低于算术运算符
等式运算符:
== 等于
!== 不等于 ==== 等于 !== 不等于
移位运算符: 0 填充补移出的空位
移位的位数变化:
eg;4'b1001 << 1 = 5'b10010 4'b1001 << 2 = 6'b1001000 4'b1001 >> 1 = 4'b0101 4'b1001 >> 2 = 4'b0100 1 << 6 = 32'b1000000 //默认最少是 32 位
循环语句:
forever repeat
while
for
forever /连续的执行语句
forever 语句 repeat /连续执行一条语句 n 次
repeat(表达式)语句
eg;repeat(size)
begin
if(shif_opb[1])
result = result + shif-opa;
shif_oba = shif_opa << 1; shif_opb = shif_opb >> 1;
模块的结构、数据类型、变量和基本运算符号
module 模块名(口 1,口 2,.....)
引用模块端口: 严格按照端口的顺序来连接:
模块名(连接端口 1 信号名,连接端口 2 信号名,.....); 引用时用'.'符号,标明原模块是定义时规定的端口号:
模块名(.端口 1 名(连接信号 1 名),.端口 2 名(连接信号 2 名)....); eg; mydesign M1(.sin(serialin),.pout(parallel)) sin/pout 是 M1 的 mydesign 的端口, serialin/parallel 是 M1 的端口,是 M1 引用 mydesign 的模块
memory: 对 reg 变量建立数组来对储存器建模,可以描述 RAM 存储器、ROM 存储器、reg 文件。数组
中的每一个单元通过一个数组索引进行寻址,没有多维数组。
memory 数据是通过扩展 reg 型数据的地址范围来生成的。 reg[n-1:0] 存储器名[m-1:0]/[m:1] //n 位存储器,m 个存储器 eg;reg[7:0] mema[255:0]
reg[width-1:0] R 变量 1,变量 2.....; wire[width-1:0] W 变量 1,变量 2.....;
assign 后面加一个方程式即可 eg; assign a = b & c # 延时单位时间 eg; #2 延时两个单位时间
always 用来描述组合逻辑和时序逻辑; always @ (posedge clk or posedge clr); //上下列子等价 begin if(clr) q <= 0; else if(en) q <= d; end
//x 在 16 进制中表示 4 位二进
负数 只需要在位宽前面加'-'号 //必须写在数字定义表达式的前面 //-3'b001 下划线 分隔开数提高程序的可读性 //只能用于具体的数字之间 //3'b0_0_1
parameter 型 定义一个标识符代表一个常量,是参数型数据的确认符: parameter 参数 1=表达式,参数 2=表达式,....... //表达式可以是数字或者已定义过的参数 eg; parameter average_delay = (r + f) / 2;
defparam 改变另一个模块中的参数 反标注到焖鸡 Verilog 网表上
eg; 'include 'Top.v' 'include 'Block,v' 'include 'Annotate,v'
// 利用这种方法把布线延迟通过布线工具生成的延迟参数文件
module Test; wire W; Top T();
endmodule
wire / tri 网络类型的变量不能储存值,只能由驱动器驱动//门或连续赋值语句,assign,驱动器为连 接网络,该变量的值为高阻值 z:
wire 表示单个门驱动或连续赋值语句驱动的网络型数据,tri 表示多驱动器驱动的网络型数据
wire:
输入输出参数类型默认定义为 wire wire[n-1:0]/[n:1] 数据名 1,数据名 2,...... 数据名 i // i 条总线,每条总线内有 n 条线路 eg;wire a; // 1 个 1 位的 wire 数据
end
while /执行一条语句直到满足
while(表达式)语句 eg;while(tempreg)
个唯一的存储地址
条件语句、循环语句、块语句和生成语句
if_else
if() if()/else if()/else if()/else else 总与最近的 if 配对
条件语句必须在过程块中使用
0,x,z 为假
case //常用于微处理器的指令译码 case(表达式) <case 分支> endcase
顺序块:
每条语句的延迟时间是相对于前一条语句的仿真时间而言
begin
语句 1;
语句 2;
.
.
. 语句 n;
end
//wk.baidu.com
begin:块名
// 块名即该块的名字,一个标识名,声明语句可以是参数声明
语句、reg、interger、real
块内声明语句
语句 1; 语句 2;
.
.
.
语句 n;
并行块: // 每条语句的延迟时间是相对于程序流程控制进入块内的仿真时间而言,延迟时
相关文档
最新文档