Verilog代码
module Q52QuadrupleBus3Stlate(GAB,GBA,A,B);
inout [3:0] A,B;
input GAB,GBA;
reg winA,winB;
assign B = (GAB==1&&GBA==0) ? winA : 4'hz;
assign A = (GAB==0&&GBA==1) ? winB : 4'hz;
always @ (GAB or GBA)
begin
winA <= A;
winB <= B;
end
endmodule
测试台
`timescale 1ps / 1ps
module Q52TestBench;
reg GAB;
reg GBA;
// Bidirs
wire [3:0] A;
wire [3:0] B;
parameter step = 10000;
Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B);
initial begin
GAB = 0;
GBA = 0;
A = 0; B = 0;
#step GAB = 1;
#step GBA = 0;
#step GAB = 0;
#step GBA = 1;
#step GAB = 1;
#step GBA = 0;
#step GAB = 0;
#step GBA = 1;
#(step*10) $finish;
end
endmodule
答案 0 :(得分:1)
在Verilog中:
wire
必须由实例化模块的output
(或inout
)或assign
声明驱动
reg
必须由always
或initial
块驱动。
关于信号是寄存器还是电线的决定主要由驱动信号的代码类型驱动。您的信号A
和B
由实例化模块(uut
)的输出和initial
块驱动。所以,你有一个两难的境地。幸运的是,有一个简单的解决方案,这在Verilog中很常用。
要从inout
或initial
块中驱动always
,除了连接到模块inout
端口的电线外,还需要一些额外的信号({{1在你的情况下}和A
。您需要B
与每个对应:
reg
和一个与每个对应的启用信号:
reg [3:0] Ain;
reg [3:0] Bin;
然后,您需要使用reg Aen;
reg Ben;
语句实现一些三态驱动程序:
assign
您需要从assign A = Aen ? Ain : 'bz;
assign B = Ben ? Bin : 'bz;
块而不是reg
块中驱动initial
:
wire
最后,您还需要驱动来自同一 Ain = 0; Bin = 0;
块的启用信号:
initial
这是完整的代码:
Aen = 1; Ben = 1;