1.关于做仿真的报错
今天在写完测试文件做仿真时出现以下错误:
[VRFC 10-529] concurrent assignment to a non-net right_a1 is not permitted [“E:/vivado/projects/asy_LIF_model/asy_LIF_model.srcs/sim_1/new/tb_test.v”:37]
经查找发现:不管子模块本身的输出是wire型还是reg型,在对子模块调用时,输出接口必须接wire 型变量。
2.Verilog代码问题
以前写同或:!(A^B)
今天发现有专门的同或运算符:~^或者 ^~
3.Verilog内置门
Verilog语言内置了12个基本门级元件模型,如下表所示。门级元件的输出、输入必须为线网类型的变量。
多输入门
and、nand、or、nor、xor和xnor是具有多个输入的逻辑门,它们的共同特点是:只允许有一个输出,但可以有多个输入。and的一般调用格式为:
and A1(out, in1, in2, in3);
其中,调用名A1可以省略。nand、or、nor、xor和xnor的调用格式与and的类似。
多输出门
buf、not是具有多个输出的逻辑门,它们的共同特点是:允许有多个输出,但只有一个输入。一般的调用格式为:
buf B1(out1, out2,…, in);
not N1(out1, out2,…, in);
其中,调用名B1、N1可以省略。
三态门
bufif1、bufif0、notif1和notif0是三态门元件模型。这些门有一个输出、一个数据输入和一个输入控制。如果输入控制信号无效,则三态门的输出为高阻态z。一般的调用格式为:
bufif1 B1(out, in, ctrl);
bufif0 B0(out, in, ctrl);
notif1 N1(out, in, ctrl);
notif0 N0(out, in, ctrl);
4.仿真问题
有时候代码一样,但就是仿真不出人家的波形,可以试一试在仿真开始时候先#100,(应该也可以是其他时间)至于为什么不知道,玄学问题,可以解释为先给电路一个反应的时间。
5.报错信息
syntax error near “non-printable character with the hex value"0xa3"”.
表示代码中有地方用了中文输入的分号。
6.Verilog for循环写法
for(i=0;i<12;i=i+1)
注意:是分号,不是逗号
7.防止信号被综合优化掉的方法
(* keep = “true” *) reg [15 : 0] dataout_ii2;
这样就可以防止在综合时信号被综合掉
(* keep_hierarchy = “yes” )module fre( a, b, c, d);
或者
( keep_hierarchy = “yes” *)fre fre_inst( a, b, c, d);
信号前面将keep hierarchy选择yes ,或者选择soft(在综合时保持层次),这样有利于你从模块中找到你想抓取的信号和信号名不被更改。
(* dont_touch = “true” *) wire a;
可以防止信号在综合,以及布局布线的时候被优化掉。
(转载自https://blog.csdn.net/Reborn_Lee/article/details/99550802)
8.同一个always块内不能同时使用阻塞和非阻塞赋值
9.always的敏感信号列表中不能同时边沿敏感和电平敏感
10.always敏感列表里,不能同时有同一个信号的上升沿和下降沿,因为可以合并成一个电平事件
**11.做仿真时一般一个testbench实例化一个模块,若实例化多个模块可能会出现“*module is not defined”的错误,仿真失败。
12.Verilog中的移位
>>:逻辑右移
不考虑符号位,右移一位,左边补0
>>>:算数右移
需要考虑符号位,右移一位,若符号位时1,则补1,0则补0,所以算数右移也相当于带符号的除法,右移n位相当于除以2的n次方
使用方法:
a>>n、
算数左移和逻辑左移
这俩货一样,都是右边补0,相当于做乘法,移位n位,相当于乘2的n次方
循环移位:
用拼接运算符啊
(原文:https://blog.csdn.net/Reborn_Lee/article/details/89813616)