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 связаны с синтезом; так что, похоже, существует некоторая путаница в некоторых фундаментальных понятиях.

Другие вопросы по тегам