Testbench в Verilog выдает ошибки, говорящие о неправильном использовании реального выражения
Когда я запускаю свой тестовый стенд, он выдает ошибку
ERROR:HDLCompiler:480 - "/home/ise/FPGA/trapezoid/testbed.v" Line 31: Illegal context for real expression
Это мой первый проект в Verilog, поэтому я не знаю, что случилось. Я пытаюсь настроить простой тестовый пакет, как показано на странице 10 для моего кода. Код с UCF компилируется просто отлично, поэтому он должен быть чем-то в тестовом стенде. Код testbench очень похож на код в powerpoint, поэтому я думаю, что это происходит из-за моей попытки установить локальные переменные для определенных значений для теста, а также из-за того, что я не определил другой вход. (Мне нужно сделать это, потому что для реального тестирования этого нужно иметь два входа для SIGNAL, но я не могу сделать это с помощью простого тестового стенда, описанного в powerpoint. Поэтому я установил локальные переменные на то, что им нужно, и нести на.) Обратите внимание, что эта ошибка все еще происходит, когда SIGNAL
определяется как равный 0.
Любая помощь будет оценена. Я использую Oracle VM Virtualbox ISE.
Код
module trapverilog(
input CLK,
input SIGNAL,
input x,
input SUM, // OUT is mapped to SUM on board
output reg OUT
);
reg[64:0] yregone;
reg[64:0] yregtwo;
reg[64:0] sum;
always @(posedge CLK)
begin
yregtwo = yregone;
yregone = SIGNAL;
if (yregtwo != 0)
begin
sum = ((yregone + yregtwo)*x/2) + SUM; //treats x as plain h, change if treated as h/2
OUT = sum;
end
end
endmodule
Файл конфигурации пользователя
NET "CLK" LOC = P126;
NET "SIGNAL" LOC = P35 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = FAST;
NET "x" LOC = P34 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = FAST;
NET "OUT" LOC = P33 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = FAST;
Testbed
module testbed();
reg CLK, SIGNAL, x, SUM;
wire OUT;
// instantiate device under test
trapverilog dut(.CLK(CLK), .SIGNAL(SIGNAL), .x(x), .SUM(SUM), .OUT(OUT));
// apply inputs one at a time
initial begin
x = 1; CLK = 1; SUM = 0; trapverilog.yregone = 1; trapverilog.yregtwo = 2; #10; // apply input, wait
if (OUT !== 1.5) $display("failed."); // check
end
endmodule
1 ответ
Конкретная ошибка является результатом сравнения OUT
в 1.5
ближе к концу испытательного стенда. В отличие от некоторых языков программирования, Verilog строго типизирован и имеет много типов, которые не могут быть синтезированы, как вы, кажется, делаете на основе вашего UCF
,
Однако, как упоминал duskwuff, существует довольно много проблем с предоставленным вами кодом и даже с различиями между симуляцией и синтезом. Испытательные стенды предназначены только для моделирования, в то время как файлы ограничений, такие как UCF
для FGPA связаны с синтезом; так что, похоже, существует некоторая путаница в некоторых фундаментальных понятиях.