#verilog #simulation #fpga #vivado
#verilog #Симуляция #fpga #vivado
Вопрос:
Я пытаюсь запустить поведенческое моделирование в моем коде Verilog в Vivado. Однако после запуска моделирования вместо получения выходных данных они отображаются в виде красных линий с XX, что, я полагаю, означает, что они не определены.
Я попытался изменить временную шкалу в верхней части файлов Verilog, как показано в сообщении на форуме Xilinx, но это не решило мою проблему.
Вот моя программа Verilog:
module ctrl(
input clk,
input [5:0] A,
input [5:0] B,
input [3:0] C,
output reg [6:0] led
);
always @(posedge clk)
begin
case(C)
4'b0000:
//A B
led <= A B;
4'b0001:
//A - B
led <= A - B;
4'b0010:
//A
led <= A 1'b1;
4'b0011:
//A--
led <= A - 1'b1;
4'b0100:
//B
led <= B 1'b1;
4'b0101:
//B--
led <= B - 1'b1;
4'b0110:
//A amp; B
led = (A amp; B);
4'b0111:
//A | B
led = (A | B);
4'b1000:
//A ^ B
led = (A ^ B);
4'b1001:
//~A
led = {1'b0,~A[5:0]
4'b1010:
//~B
led = {1'b0,~B[5:0]};
4'b1011:
//A << B
led = A << B;
4'b1100:
//B << A
led = B << A;
4'b1101:
//Light LED[0] if A > B
if(A > B)
led = 7'b0000001;
else
led = 7'b0000000;
4'b1110:
//Light LED[0] if A < B
if(A < B)
led = 7'b00000001;
else
led = 7'b0000000;
4'b1111:
//Light LED[0] if A=B
if(A == B)
led = 7'b0000001;
else
led = 7'b0000000;
default:
//Unimplemented opcode
led <= 7'b1111111;
endcase
end
endmodule
Тестовый стенд
module ctrl_testbench();
reg[5:0] A;
reg[5:0] B;
reg[3:0] C;
wire[6:0] led;
ctrl dut (
.A(A),
.B(B),
.C(C),
.led(led)
);
initial begin
A = 6'b000001;
B = 6'b000001;
C = 4'b0000;
#100;
A = 6'b000000;
B = 6'b000000;
C = 4'b0000;
#100;
A = 6'b000010;
B = 6'b000010;
C = 4'b0001;
end
endmodule
Затем временная диаграмма показывает это после запуска поведенческого моделирования. Как вы можете видеть, A-C (входные данные) заполнены правильно, однако светодиод (выходной сигнал) горит красным и показывает XX.
Я пытаюсь показать фактические результаты.
Ответ №1:
Вам необходимо создать тактовый сигнал и управлять clk
входом вашего ИУ:
module ctrl_testbench();
reg[5:0] A;
reg[5:0] B;
reg[3:0] C;
wire[6:0] led;
reg clk;
initial begin
clk = 0;
forever #5 clk = ~clk;
end
ctrl dut (
.clk(clk),
.A(A),
.B(B),
.C(C),
.led(led)
);
initial begin
A = 6'b000001;
B = 6'b000001;
C = 4'b0000;
#100;
A = 6'b000000;
B = 6'b000000;
C = 4'b0000;
#100;
A = 6'b000010;
B = 6'b000010;
C = 4'b0001;
$finish;
end
endmodule
Мне было удобно создать 2 initial
блока. Первый никогда не заканчивается из-за forever
, а второй необходим для завершения моделирования $finish
. Обычно выделяют отдельные функциональные возможности с использованием нескольких initial
блоков.