| |
最近写了一些RTL code,因为新的project都用systemverilog风格,所以自己也都follow。以前用wire和reg的,现在一律用logic声明。 结果弄巧成拙,经常整出x来,无耐又改成wire。 Systemverilog中增加了logic变量类型,其好处是可以代替以前的wire和reg,使其在assign/instance drive/always都可以使用,请看下面这个例子:
logic abc;
The following statements are legal assignments to logic abc:
1) assign abc = sel ? 1 : 0;
2) not (abc,pqr),
3) always #10 abc = ~abc;
于是我就以为logic代替了wire和reg,可以随便用了,于是经常这么写:
logic abc =sel ? 1:0;
结果仿真结果老是出错,abc的值是x。
于是特地去做实验,把上述语句在testbench里测,发现,咦,可以输出正常值啊!经过试验,我发现如下惊天秘密:
1. 在testbench顶层里可以随便写
2. 在design的文件里只能有这两种写法:
a. wire abc =sel ? 1:0;
b. logic abc;
assign abc =sel ? 1:0;
下面这个例子供verify:
module test_svlogic();
logic clk=0;
always clk = #5 ~clk;
logic [3:0] a= 4'b0010;
logic [3:0] b= 4'b0000;
//logic [3:0] mux_ab= a&b;
logic [3:0] mux_ab;
mux mux(.a(a),
.b(b),
.mux_ab(mux_ab));
initial
begin
#40
$display("a=%d,mux_ab=%d\n",a,mux_ab);
$stop;
end
endmodule