Verilog程序可以是按照逻辑来书写,也可以直接描述实现逻辑功能的电路图,实现某个功能,可以使用多个模块嵌套来实现,上一个模块的和子模块的端口连接可以使用.out(sout)这种写法进行连接。
1、标识符:字母数字下划线组成,开头必须是字母或者下划线,区分大小写。
2、关键字:含有特殊含义,不能作为普通标识符。
3、注释方法:// //, /* */
4、线性逻辑:用于练习赋值语句,描述组合逻辑或者module之间的信号连接线,wire、assign。
5、数据类型:整数型、实数型、字符型(每个字符按照8bit ASII码的整型存储)整数型需要明确指定数据的位宽,实数型目前不可综合。
6、系统任务:$monitor,提供了监控和输出参数列表中的参数表达式或者变量值的功能起中调用$monitoron和$monitoroff函数来启动和关闭函数。
7、时间度量函数:$time(整数型)、$realtime(实数型)。
8、系统任务:$finish:作用是退出仿真器,返回主操作系统,结束仿真过程;$stop:作用是把EDA工具设置成暂停模式,在仿真环境下给出一个交互式的命令提示符,把控制权交给客户。
9、系统任务$readmemb和readmemh,分别是二进制和十进制的方式,同来从文件中读取数据存储器中,格式:$readmemh(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>),其中起始地址和结束地址可有可无。
10、系统任务:$random:提供一个产生随机数的手段,用法:$random%b,其中b>0,他给出 一个范围在(-b+1):(b-1)的随机数;用法:{$random%b}其中b>0,他给出一个范围在0:(b-1)的随机数。
11、编译预处理:
宏定义:`define:用一个指定的标识符(名字)来代替一个字符串;
文件包含处理:`include:是一个源文件可以将另外一个源文件的内容包含进来;
时间尺度:`timescale,用来说明跟在命令后的模块的时间单位和时间精度,一般格式:`timescale<时间单位>/<时间精度>,如果在同一个程序设计中,存在多个`timedcale命令,则利用最小的时间精度来决定仿真的时间单位,时间单位和时间精度值必须是整数;
条件编译命令:`ifdef、`else、`endif:作用是如果宏命已经被定义过了,则对程序1进行编译,程序2将被忽略:否则程序2将被编译,程序1将被编译;
条件执行:系统任务关键字:$test$plusarge:条件执行标志允许设计者在运行时控制语句执行的流程,所有语句都被编译,但是有条件的执行他们。
12、数据类型:
数字分为二进制、八进制、十进制、十六进制,书写方式为 位宽+进制+数字,没写位宽的话就默认系统位宽,最少32位,没注明进制的话默认十进制,负数直接在位宽前加负号,下划线只能用于数字和数字之间。
Parameter:是参数型数据的确认符,只能定义数字和之前已经定义过的参数,经常用于定义延迟时间和变量宽度
14、变量:wire可以用作任何方程式的输入,也可以用作assign语句或者元器件的输出;reg是寄存器数据类型的关键词,初始默认值为不定值x,reg可以赋予正值也可以赋予负值,但是当一个reg型数据是一个表达式中的操作数时候,他的值被当做是无符号的的,即正值。Memory型是通过扩展reg型数据的地址范围来生成的。需要注意的是多维变量。
15、运算符:算数、赋值、关系、逻辑、条件、位、移位、拼接运算符。
逻辑运算符:可以分为单目运算符(逻辑非)和双目运算符(逻辑与,逻辑或);
关系运算符:大于,大于等于,小于,小于等于
等式运算符:==和===的区别,!=,!==
位运算符:左移 和右移
拼接运算符:{ }
赋值语句:阻塞和非阻塞的区别,阻塞使用=,赋值语句结束,数值当场变化;非阻塞用<=,块结束后才能完成赋值操作。
16、块语句:顺序块(过程块) if else;并行块 fork jion;生成块 generate-endgenerate
三种创建生成语句的方法:循环生成、条件生成、case生成
块语句所具有的特点:嵌套块、并行块和顺序块可以混合使用命名块:可以声明局部变量,也可以被禁用;
命名块的禁用:disable+命名块,与break的区别是,break只能退出当前的循环,而disable可以禁用设计中的任何一个命名块。