verilog和modelsim学习

1,`timescale (time unit)/(time precision),该语言是用于仿真文件中指定时间单位和时间精度的,时间单位、精度的可以是1、10、100这三种整数,后面的单位可以是s、ms、us、ns、ps、fs,时间精度必须小于等于时间单位。仿真最终的时间计算是nx时间单位,然后按精度四舍五入得到的。需要注意的是同一个仿真工程里,有多个文件使用timescale,精度会按照最小的计算。

2,{}位拼接运算符,使用该运算符时必须注意两点,一是运算符里的表达式的长度必须和等号左边的长度相等;二是运算符里的任何表达式长度必须确定,如{5}是不正确的写法,必须赋予其长度,比如{24’h5}。另外,如果带参数的话,初始化可以使用a <={2*N-1{1'b1},1b0}对2*N个位赋值a[2*N-3-:N]表示截取掉最高两位,然后往后取N位

3,$标识符,用于指示这是系统任务和函数,常用于仿真中。如$stop表示停止仿真;$finish表示结束仿真;$time返回当前仿真时间;$monitor($time,a=%b,b=%h,a,b)当信号a或b变化时,返回当前时间和a、b值;$display("INFO: Current Data Bus Width is %0d bits",31+1)显示当前数据位宽是32bit;$readmemh ( "E:/readhex/mem.dat", mem )表示将路径中mem.dat文件读出存入mem存储器。

4,reg与wire,wire综合出来是信号线,只能用assign赋值;而reg只能用always@()赋值,如果敏感信号列表里有时钟,则综合出来带触发器,如果没有,则综合成逻辑电路。对于输入端口信号,只能为net型wire;对于输出信号,可以为wire也可以为reg,一般最顶层要求输出用reg信号,增强驱动能力。

5,modelsim仿真时,相对路径是经常用到的,../表示上级目录,../../表示上上级目录,这些都是相对于moedelsim工程路径而言的,即mpf文件所在的路径。而对于verilog中`include表达式也用到了相对路径,它的参考标准也是按工程路径。modelsim仿真时,如果遇到库已经编译好,但是启动仿真时却提示库元件找不到,应手动设置搜索路径。

6,task任务和function函数,主要用于需要反复例化某个模块的时候,可以使用task或function。创建task的结构:1,task 任务名;2,输入输出端口声明(如果没有端口,可以不声明);3,执行语句,逻辑实现;4,endtsk。调用task的结构:例化名(参数),参数顺序需与端口一样。需要注意的是,任务可以调用函数,且任务可以包含时间控制,但是包含时间控制的任务是不可综合的。任务的结束时任务块结束。

创建function的结构:1,function [返回值范围或类型] 函数名;2,输入端口声明;3,执行语句,逻辑实现;4,endfunction。调用function的结构:a=函数名(参数)。函数必须有返回值,且必须有输入。需要注意的是,函数中不能包含时间控。

7,verilog里always@(*)表示always语句下任一等号右边的变量发生变化(等号右边是常数就不会触发哦,所以reg变量初始化需要有一个复位信号,不能直接<=赋值,这样出来reg是未知的),都会触发语句。其实通用来讲,@()代表等待括号里的事件发生,加个always就是每当这个事件发生就触发。另外,如果always语句中敏感列表不完整,会出现意外结果,但是这种请情况一般只出现在仿真中,而不会出现在综合中,一般的综合工具会自动将描述的组合逻辑中的敏感列表添加完整。

8,阻塞赋值与非阻塞赋值。先讲讲数据类型把,verilog里经常用到的两种数据类型是wire和reg。wire表示连线,只能用assign赋值,模块的输入端口只能是wire类型,表明它的状态只能由外部输入决定;reg表示寄存器类型,只能用always、initial(用于仿真)赋值,可以综合成触发器(敏感信号为时钟)、锁存器(敏感信号不完整或逻辑不完整)、组合逻辑(敏感信号完整且逻辑完整);模块的输出端口可以是reg/wire,但其驱动的信号必须是wire,例如模块例化的时候,赋给的输出信号必须是wire。阻塞赋值用=,非阻塞用<=;阻塞赋值中等号右边的值得变化会立刻赋给等号左边(并行结构),而非阻塞赋值则会等一拍(串行结构)。一般情况下,一个always语句中只能使用一种赋值语句。其实从这里我们也可以看出,组合逻辑相当于顺序执行,而时序逻辑相当于并行执行。

9,modelsim仿真inout端口时,inout的激励需要设置后才能wire型,同时采用问号表达式,输入时赋值,输出时高组态,和dut正好相反。

10,verilog中的有符号数,可以用$signed和$unsigned进行转换。位扩展,例如sum <= a + b;如果a、b、sum位宽不同,则会进行位扩展。对于无符号数,进行0扩展;对于有符号数,进行符号位扩展,即用符号位对高位进行填充。需要注意的是,只有赋值表达式右边全部为有符号数,才会进行符号位扩展,否则进行0扩展。同时,把一个位数多的数赋值给一个位数少的数,verilog会默认截取掉最高位部分。把一个位数少的数赋值给一个位数多的数,位扩展依据等号右边的结果是有符号数还是无符号数。

11,generate语句。相当于c语言中的条件编译。格式为generate if(parameter) endgenerate.

12,算术位移与逻辑位移。逻辑位移用符号<<和>>表示,不论有符号数还是无符号数,都一样的规则,整体移动,新的位置补0。算术位移用符号>>>和<<<表示,当定义为有符号的数时,右移新的位置按符号位补;左移新的位置按0补,且最高位符号位不会保留

13,modelsim与vivado联合仿真时,修改代码后,每次要重新从vivado启动modelsim,很麻烦。可以修改project_1.sim文件中modelsim文件夹里的文件来解决此问题。xxx_simulate.do里首行添加xxx_compile.do即可,同时把xxx_compile.do最后一行的quit去掉。自己保存的wave.do也可以添加到xxx_simulate.do里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值