总结1.moore型状态机和Mealy,三段式两段式的区别
moore型的输出只和当前状态有关,因此一般将输出单独放一个always块,而这个块里面输出之和当前的状态有关,可以将到达某个状态的值赋值给输出
对于mealy型可以将输出在状态转移那段进行赋值,也可以单独的always块,进行赋值
总结2.monitor输出
- 其中一个改变后打印输出
- 在当前仿真时刻结束后输出
- 只有一个monitor活动
总结3.parameter的其他传参方式
shift sh1 (shitedVal, inval, 7); // instantiation
defparam sh1.wid=16;
这里面的shift的parameter是在module里面的
总结4.function和task能不能综合
task和function能不能综合不是绝对的,只要他们包含的语句是可综合的
总结5.用户自定义的数组实例
总结6.编译向导的tip
在前面讲到'default_nettype时,我们也遇到了类似的问题。应该尽童避免使用除了 'timescale之外的编译向导。如果的确有使用编译向导的必要,只在一个文件里用,且在文件 的最后用'unclef每一个编译向导。
总结7.generate的使用
generate一般和genvar搭配着使用,genvar定义了一个变量i, for在循环里面调用它,for循环里面可以定义一个reg类型单位宽的信号a,然后写对应的逻辑。
也可以在generate外面提前定义一个多位宽的reg信号a,然后在generate里面连接起来
总结8.理解system task和system function的区别
常用的system task如下常用的system function如下
总结9.XMR(Cross Module reference)
跨模块引用,引用不同模块的内容,net, register, event, task
模块A的reg x, A.x
模块A下面的任务B的reg x,A.B.x
总结10.Verilog 2001的新标准
• ANSI风格的模块头. module addr(input [2:0] a)
• 模块端口前的参数表,module adder #(parameter A, B)
• 支持一些新的函数,如幂运算log2(size),指数运算2*3
• ,替代or,always@(posedge clk, negedge rst_n)
• 组合逻辑always敏感列表缩写,always @()
• vector part select, 例如 byte = vector[31-:8];//byte = vector[31:24]
• 多维的数组,reg [31:0] data[127:0][127:0];
• array bit and part select
图左是verilog 1995,图右是verilog 2001支持的
• 对参数parameter定义位宽,parameter [2:0] IDLE = 3'd0
• 对模块中的参数清晰传递,如下图左是verilog 1995,图右是2001所支持的
• localparam 不能重新被定义
• generate for产生相同的模块
总结11.defparam
可以修改任意模块中的参数值,不推荐使用。可能将来会被移除,存在的原因是依靠它可以修改localparam的值
总结12. 行同步和场同步的概念
仿真测试
总结13. synopsys的design ware库的位置
synopsys安装目录下的dw,synopsys提供的IP,例如除法器,有很多个dw01,dw02,包含不同类型的库
总结14. 查找当前文件夹下的文件,包含子文件
find -name div (名字中包括div的文件)
总结15. specify块
specify块使用者不需要知道模块功能就可以建立模块的时序模型,而模块的功能留到后面再来实现
总结16. 通过.barshrc将复杂命令替代
总结17. vim分屏显示
https://vimjc.com/vim-split-window.html
Vim命令行模式下执行命令 Ctrl+w s 可将当前打开的文件进行水平方向分割
上述命令 Ctrl+w s 表示先同时按键 Ctrl 和 w,再按键 s
总结18. memory不能用的赋值方式
总结19:编译时加的宏定义
总结20. gvim在当前的窗口新开一个文件
命令行 : tabnew 路径文件名