从logic数据类型的用法看SystemVerilog的优点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从logic数据类型的⽤法看SystemVerilog的优点
对verilog的初学者来说,线⽹和变量reg之间的不同点,也许是最难的。
你有时得⽤reg⽽有时却得使⽤wire,使⽤来使⽤去,简直头晕。
⽽在SystemVerilog中,我们将会看到你可以在过去verilog中⽤reg型或是wire型的地⽅⽤logic型来代替。
实际上logic是对reg数据类型的改进,使得它除了作为⼀个变量之外,还可以被连续赋值、门单元和模块所驱动,显然,logic是⼀个更合适的名字。
举个RAM modelling的例⼦来说明上述问题,我们分别⽤Verilog和SystemVerilog来实现。
//RAM modelling in Verilog
1module mema (r_wb,addr,d_q);
2input r_wb;
3input [7:0] addr;
4inout [7:0] d_q;
5
6wire r_wb;
7wire [7:0] addr, d_q;
8reg [7:0] mem [0:255];
9
10assign d_q = (r_wb) ? mem[addr] : 8'hz ;
11
12always @(r_wb or addr)
13if (!r_wb)
14 mem[addr] = d_q;
15endmodule
//RAM modelling in SystemVerilog
1module mema (r_wb,addr,d_q);
2input r_wb;
3input [7:0] addr;
4inout [7:0] d_q;
5
6 logic r_wb;
7 logic [7:0] addr
logic [7:0] d_q; //Gotcha! should be declared: wire [7:0] d_q;
8 logic [7:0] mem [0:255];
9
10 always @(r_wb or addr)
11if (!r_wb)
12 mem[addr] = d_q;
13else
14 d_q = mem[addr];
15endmodule
如上所看,抛去inout类型外,其余所有的变量都可以声明为logic类型,不⽤区分线⽹和变量reg之间的不同点,所以,SystemVerilog的优点是不是很明显?
SystemVerilog的其他优点,请⼤家参考:
值得注意的是,logic不能有多个结构性的驱动,也就是说,logic不允许使⽤多于⼀次的持续赋值语句和输出端⼝连接的给同⼀变量赋值。
这是因为没有类似于线⽹的多重驱动变量的定论。
因此,假如你通过这些⽅式给⼀个变量赋过值,你将不能再⽤过程赋值语句给变量赋值。
如上⾯RAM modelling的代码,在对inout双向总线建模的时候,需要使⽤线⽹类型。
(⽐起verilog-1995,新增加的许多systemverilog feature都要求变量只有⼀个驱动!)
如下代码的第3⾏和第4⾏,logic型的"exception"相继被两个实例化赋值,于是编译器便会报错。
解决的办法是把exception定义成wire型。
//Multiple Driver Example
1module multiple_drivers (output logic exception,
2input logic [7:0] a, b);
3 is_zero inst0 (exception, b);
4 is_greater inst1 (exception, a, b);
5endmodule
6
7module is_zero (output logic zero,
8input logic [7:0] x);
9always @(x)
10if (x ==0) zero =1;
11else zero =0;
12endmodule
13
14module is_greater (output logic greater, 15input logic [7:0] x, y);
16always @(x, y)
17if (x > y) greater =1;
18else greater =0;
19endmodule。