Verilog(ModelSim)小收获

写在最前面:做什么事都要冷静,心态平和
Everything will be easy.

  1. [email protected](*) : [email protected](*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,不用自己考虑
  2. 只能这样赋值:reg[5:0] mark = 6'b100110; 赋初值需要直接在后面写,不能像c语言一样先定义再赋。另外verilog赋值还可以在模块语句里面赋值,比如always语句里面。
  3. integer也是一种寄存器数据类型,integer类型的变量为有符号数,而reg类型的变量则为无符号数,除非特别声明为有符号数,还有就是integer的位宽为宿主机的字的位数,但最小为32位,用integer的变量都可以用reg定义,只是对于用于计数更方便而已。reg,integer,realtime都是寄存器数据类型,定义在Verilog中用来保存数值的变量,和实际的硬件电路中的寄存器有区别。
  4. 逻辑移位运算符:<<, >>
    算数移位运算符:>>>, <<< (慎用)
  5. [email protected] 模块内只能对reg类型的变量进行赋值
  6. 内存模型:Verilog中提供了二维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如下:
    reg [wordsize : 0] array_name [0 : arraysize];
    例如:
    reg [7:0] my_memory [0:255];
    如果要存储一个值到某个单元中去,可以这样做:
    my_memory [address] = data_in;
    而如果要从某个单元读出值,可以这么做:
    data_out = my_memory [address];
    但要是只需要读一位或者多个位,就要麻烦一点,因为Verilog不允许读/写一个位。这时,就需要使用一个变量转换一下:
    例如:
    data_out = my_memory[address];
    data_out_it_0 = data_out[0];
    这里首先从一个单元里面读出数据,然后再取出读出的数据的某一位的值。
  7. library : View -> library
  8. 点了simulate, 没有弹出objects窗口:右键->Add to->wave->all items in region
  9. compile后错误信息点不出来:点compiler selected(单个文件)
  10. Non-blocking assignment in function is illegal.
  11. 仿真时,出现:Error loading design 错误:检查一下modelsim的日志文件(工程目录下的transcript),一般都能找到出问题的模块
  12. 寄存器堆信号:rst_n : reset_negative 低电平重置
  13. verilog行为仿真时钟激励显示总是z:initial内部就写信号的初始值,出现z的情况一般是没有初始值
  14. $display: 打印
  15. case()….endcase

  16. 这里写图片描述 ModelSim打不开.v文件:试着按open按钮