一.case语句
以前接触过case语句,知道case语句分为case,casex,以及casez三类,但是觉得一般用不到,就没怎么注意,可是因为这个导致程序出错就不得不注意了,在写一个外围测试元件的时候,写了以下语句:
1
2
3
4
5
casex(state)
13'b1_xxxx_xxxx_xxxx: {rom_sel,ram_sel}=2'b10;
13'b0_xxxx_xxxx_xxx1: {rom_sel,ram_sel}=2'b01;
default: {rom_sel,ram_sel}=2'b00;
endcase
这里,如果换成case,输出结果则与预期不符,casez用来处理不用考虑高阻值z的比较过程,casex用来处理既不用考虑高阻值z也不用考虑不定态x的情况,改成case,输出结果一般都是default的输出结果。
二.取反
Verilog有~和!两个符号,之前认为可以共用。的确,有的情况可以通用,但是有的情况不可以通用,比如,你定义一个一位变量,以及一个7位变量,将七位变量分别以上述两种符号取反并将所得结果赋值给上述定义的一位变量,对比结果可知(one代表!的输出结果,zero代表~的运算结果):
上述结果告诉我们:!除非你的值为00,否则该运算符的结果都为0; ~就看七位变量的最低位,将最低位取反为该运算符的结果;
三.常用的系统函数
为了更好的测试我们的代码,Verilog中有一些常用的系统函数,如$display 、$monitor、$strobe等等,其中:
1.$monitor表示连续监测变量,每当参数列表中的变量或者表达式的值发生变化时,整个参数列表中变量或者表达式的值都将输出显示;
2.$display,$strobe都表示打印输出结果,但区别是$strobe只在当前时刻结束才输出打印结果,而$display只要仿真器观测到变量就会打印输出结果;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28`timescale 1ns/1ps
module test;
reg a,b;
initial
begin
#1 a=0;
b=1;
a<=b;
b<=a;
$write("$display");
$display("%b %b %b", $time, a, b);
$write("$strobe");
$strobe("%b %b %b", $time, a, b);
$write("$monitor");
$monitor("%b %b %b", $time, a, b);
#2 a=0;
b=1;
#3 a=1;
b=1;
end
endmodule
测试代码的结果: