Неизвестно Неправильный результат при моделировании дизайна Verilog в моделях
Дизайн:
//structural description of 74151
module s_74151(VCC, GND, D0, D1, D2, D3, D4, D5, D6, D7, A, B, C, STROBE, Y, W);
input D0, D1, D2, D3, D4, D5, D6, D7; //data inputs
input STROBE; //enable
input A, B, C; //Data select
output Y, W; //outputs
input supply1 VCC; // logic 1 vcc supply wire
input supply0 GND; // logic 0 gnd supply wire
wire n1, n2, n3, n4, n5, n6, n7, n8; // temp AND outputs
wire A1, A2, B1, B2, C1, C2, S1; //address buffers
wire r1; //temp NOR output
not(A1, A);
not(B1, B);
not(C1, C);
not(A2, A1);
not(B2, B1);
not(C2, C1);
not(S1, STROBE);
and(n1, D0, A1, B1, C1, S1);
and(n2, D1, A2, B1, C1, S1);
and(n3, D2, A1, B2, C1, S1);
and(n4, D3, A2, B2, C1, S1);
and(n5, D4, A1, B1, C2, S1);
and(n6, D5, A2, B1, C2, S1);
and(n7, D6, A1, B2, C2, S1);
and(n8, D7, A2, B2, C2, S1);
nor(r1, n1, n2, n3, n4, n5, n6, n7, n8);
not(Y, r1);
buf(W, r1);
endmodule
//74151 using data flow.
module d_74151(VCC, GND, D0, D1, D2, D3, D4, D5, D6, D7, A, B, C, STROBE, Y, W);
input D0, D1, D2, D3, D4, D5, D6, D7; //data inputs
input STROBE; //enable
input A, B, C; //Data select
output Y, W; //outputs
input supply1 VCC; // logic 1 vcc supply wire
input supply0 GND; // logic 0 gnd supply wire
wire n1, n2, n3, n4, n5, n6, n7, n8; // temp AND outputs
wire A1, A2, B1, B2, C1, C2, S1; //address buffers
wire r; //temp NOR output
assign A1 = !A;
assign B1 = !B;
assign C1 = !C;
assign A2 = !A1;
assign B2 = !B1;
assign C2 = !C1;
assign S1 = !STROBE;
assign n1 = D0 && A1 && B1 && C1 && S1;
assign n2 = D1 && A2 && B1 && C1 && S1;
assign n3 = D2 && A1 && B2 && C1 && S1;
assign n4 = D3 && A2 && B2 && C1 && S1;
assign n5 = D4 && A1 && B1 && C2 && S1;
assign n6 = D5 && A2 && B1 && C2 && S1;
assign n7 = D6 && A1 && B2 && C2 && S1;
assign n8 = D7 && A2 && B2 && C2 && S1;
assign r = !(n1 || n2 || n3 || n4 || n5 || n6 || n7 || n8);
assign Y = !r;
assign W = r;
endmodule
Испытательный стенд:
`include "C:/Users/Muaz Aljarhi/Google Drive/Muaz/Hardware_Designs/Verilog Course/74151.v"
module m74151_tb();
reg D0, D1, D2, D3, D4, D5, D6, D7, A, B, C, STROBE;
wire VCCs, GNDs, VCCd, GNDd, Ys, Ws, Yd, Wd;
s_74151 s7(.VCC(VCCs), .GND(GNDs), .D0(D0), .D1(D1), .D2(D2), .D3(D3), .D4(D4), .D5(D5), .D6(D6), .D7(D7), .A(A), .B(B), .C(C), .STROBE(STROBE), .Y(Ys), .W(Ws));
d_74151 d7(.VCC(VCCd), .GND(GNDd), .D0(D0), .D1(D1), .D2(D2), .D3(D3), .D4(D4), .D5(D5), .D6(D6), .D7(D7), .A(A), .B(B), .C(C), .STROBE(STROBE), .Y(Wd), .W(Wd));
initial begin
$display("simulation started");
$monitor("Input: D0 = %b, D1 = %b, D2 = %b, D3 = %b, D4 = %b, D5 = %b, D6 = %b, D7 = %b, A = %b, B = %b, C = %b, STROBE = %b\nStructural: Y = %b, W = %b\nData Flow: Y = %b, W = %b\n",
D0, D1, D2, D3, D4, D5, D6, D7, A, B, C, STROBE, Ys, Ws, Yd, Wd);
D0 = 1;
D1 = 0;
D2 = 1;
D3 = 1;
D4 = 0;
D5 = 1;
D6 = 0;
D7 = 0;
A = 0;
B = 0;
C = 0;
STROBE = 1;
#1 STROBE = 0;
#8 begin
$display("simulation ended");
$stop;
end
end
always #1 A = !A;
always #2 B = !B;
always #4 C = !C;
endmodule
Выходной результат:
# simulation started
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 0, B = 0, C = 0, STROBE = 1
# Structural: Y = 0, W = 1
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 1, B = 0, C = 0, STROBE = 0
# Structural: Y = 0, W = 1
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 0, B = 1, C = 0, STROBE = 0
# Structural: Y = 1, W = 0
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 1, B = 1, C = 0, STROBE = 0
# Structural: Y = 1, W = 0
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 0, B = 0, C = 1, STROBE = 0
# Structural: Y = 0, W = 1
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 1, B = 0, C = 1, STROBE = 0
# Structural: Y = 1, W = 0
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 0, B = 1, C = 1, STROBE = 0
# Structural: Y = 0, W = 1
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 1, B = 1, C = 1, STROBE = 0
# Structural: Y = 0, W = 1
# Data Flow: Y = z, W = x
#
# Input: D0 = 1, D1 = 0, D2 = 1, D3 = 1, D4 = 0, D5 = 1, D6 = 0, D7 = 0, A = 0, B = 0, C = 0, STROBE = 0
# Structural: Y = 1, W = 0
# Data Flow: Y = z, W = x
#
# simulation ended
Я не знаю, почему или как я получил значения x и y для выходов Y и W модуля d_74151. Хотя я проверил и увидел, что r получает правильный результат 0 или 1, Y и W, которые зависят от r, по-прежнему отображают эти значения в симуляции. Любые идеи по этому поводу и как решить это? Заранее спасибо.
PS это структурное описание и описание потока данных для 8-битного мультиплексора / селектора с включенным включением.
2 ответа
Ваш d7
Экземпляр ведет тот же провод (Wd
) с 2 выходными портами: Y
а также W
, Yd
провод не оторван. Чтобы избавиться от х на Wd
подключить Yd
к Y
выходной порт.
Изменить:
d_74151 d7(.VCC(VCCd), .GND(GNDd), .D0(D0), .D1(D1), .D2(D2), .D3(D3), .D4(D4), .D5(D5), .D6(D6), .D7(D7), .A(A), .B(B), .C(C), .STROBE(STROBE), .Y(Wd), .W(Wd));
чтобы:
d_74151 d7(.VCC(VCCd), .GND(GNDd), .D0(D0), .D1(D1), .D2(D2), .D3(D3), .D4(D4), .D5(D5), .D6(D6), .D7(D7), .A(A), .B(B), .C(C), .STROBE(STROBE), .Y(Yd), .W(Wd));
Эти ошибки легче отлаживать, используя инструмент отладки, который позволяет отслеживать сигналы по сигналам.
Переменная не может иметь более одного непрерывного драйвера. Для отладки лучше использовать основанный на форме сигнала подход
Например, рассмотрим следующую реализацию
например:
module top ( input a,b, output y,y1);
assign y = a & b;
assign y1 = a | b;
endmodule
Фрагмент тестового стенда:
wire y,y1;
top u0(.a(a),
.b(b),
.y(y),
.y1(y) // y should be replaced with y1 or else 'X' will be seen in the bus
);
Здесь y и y1 связаны с y. В общем случае значение по умолчанию для провода - "High Impedance(Hi-Z)", так что "wire y" будет управляться со значениями y согласно экземпляру.y(y), но это значение y при если передать значение y1, которое уже приводит к некоторому другому логическому выводу, это приводит к противоречию, которое приводит к "X". пример на детской площадке EDA
В вашем коде вы подключилисьwire Wd
"к обоим выходам Y,W в экземпляре тестового стенда d_74151, который вызвал 'X' на выходе, как и ожидалось. Для разрешения подключите отдельные провода к каждому порту Y и W.