数字电路设计主要就是,选择器、全加器、比较器,几个常用逻辑门,再加个D触发器,电路基本都能实现了。
组合逻辑+时序逻辑
组合逻辑用assign或always@(*)实现,
时序逻辑用always@(posedge clk or negedge rst_n)
有人说掌握Verilog 20%的语法就可以描述 90%以上的电路,说的对。
casez
always
这样的case有优先级选择,虽然可综合,但是不推荐使用,有优先用if-else,没有直接用case。
synopsys的EDA工具有关于full case与parallel case可以查看下面博客链接。
https://blog.csdn.net/li_hu/article/details/10336511
generate+for
合理使用generate+for循环可以提高编码效率,同样的赋值语句需要赋值多次。
generate
同一个模块需要实例化多次
generate
当然这样写debug会有一些困扰,Verdi会显示每一个generate块,选中对应的块,加进去的波形就会是对应的bit信号。
generate if/case
做一些通用IP的方法,比如要做一个选择器通用IP,支持二选一,三选一,四选一。
generate
generate case可以写更多的分支
generate
调用的时候只需要
mux
参数化定义
模块化设计,功能模块的划分尽可能细, 差别不大的代码通过参数化达到重复使用的目的。
always
实例化
mux
移位操作
对于移位操作直接用位拼接,
assign
写成
assign
如果是有符号数,高位要补符号位。也就是算术移位。
always
shift也可能是有符号数,正数左移,负数右移。右移方法同理。
$clog2系统函数
Verilog-2005引入了$clog2系统函数,为了方便计算数据位宽,避免位浪费。这个其实是来凑数的。
parameter
最后
欢迎指点,有哪些Verilog的奇技淫巧,留言告诉我吧。