在实际中多驱动也是很常见的。
如下图,模块1~3的输出同时连接到信号result上,那么result的值到底应该如何选择呢?比如图中所示情况,driver2和driver3是关闭的,而只有driver1在驱动,所以result应该为0。

图1 一个多驱动的例子
如果上图中driver2的值为1,那么这时result的值该如何决定呢?由于1与0的驱动强度一样,所以result应该为X。Syst定义的逻辑值解析表如下,它定义了多驱动情况下如何进行逻辑值解析。
|
0 | 1 | Z | X |
0 | 0 | X | 0 | X |
1 | X | 1 | 1 | X |
Z | 0 | 1 | Z | X |
X | X | X | X | X |
SystemC中引入了解析逻辑向量信号(Resolved Log Vector signal)来解决多驱动的问题。可以使用下面的方法定义解析型端口:
sc_in_rv<n> x; //x被定义为n比特宽的解析逻辑向量型输入端口
sc_out_rv<n> y; //y被定义为n比特宽的解析逻辑向量型输出端口
sc_inout_rv<n> z; //z被定义为n比特宽的解析逻辑向量型双向端口
这里n是任意正值。值得注意的是解析型的端口比普通的端口需要更多的仿真时间,如果不是必须,最好不要使用。
类似的,解析型信号的定义方法如下:
sc_signal_rv<n> x; //宽度为n比特的解析型向量信号x。
下面举一个使用解析向量信号的例子,如图2-8。
图2 2选1的3态驱动输出逻辑
给出源代码如下:
- #ifndef __TRISTATE_H
- #define __TRISTATE_H
- #include <systemc.h>
- // Three-state buffer inference with resolved logic output
- #include "systemc.h"
- SC_MODULE(Tristate) {
- sc_in<bool> in_sela, in_selb;
- sc_in<bool> in_a;
- sc_in<bool> in_b;
- sc_out_rv<1> out_1;
- // Method for first three-state driver
- void tristate_a();
- // Method for second three-state driver
- void tristate_b();
- // Constructor
- SC_CTOR( Tristate) {
- SC_METHOD( tristate_a);
- sensitive << in_sela << in_a;
- SC_METHOD( tristate_b);
- sensitive << in_selb << in_b;
- }
- };
- void Tristate::tristate_a() {
- if (in_sela.read()){
- out_1.write(in_a.read());
- }else{
- out_1.write("Z");//SC_LOGIC_Z
- }
- }
- void Tristate::tristate_b() {
- if (in_selb.read()){
- out_1.write(in_b.read());
- }else{
- out_1.write("Z");
- }
- }
- #endif