RTL-моделирование модуля FIFO с помощью Active HDL (на Lattice Diamond)
Я оцениваю ПЛИС на коммутационной плате MachXO2, которую производит Lattice Semiconductor. Сейчас я пытаюсь моделировать RTL модуля FIFO_DC, который генерируется IPExpress.
Я создал простой тестовый стенд для модуля FIFO. Когда я запустил Active-HDL из мастера моделирования, я получил следующее сообщение об ошибке.
Я не могу получить никакой поддержки от Lattice, потому что эта работа - мое хобби, а не моя работа. Не могли бы вы дать мне совет по этой проблеме? Любая помощь будет оценена. Заранее спасибо.
Сообщение об ошибке на консоли Active-HDL
ELAB2: Фатальная ошибка: ELAB2_0036 Неразрешенная иерархическая ссылка на "PUR_INST.PURNET" из модуля "FifoTest_tb.fifo.FifoMacro_0_3" (модуль не найден).
Образец ЛПВП
[FifoTest_tb.v] -> тестовая среда для модуля FIFO
`timescale 1ns/1ps
module FifoTest_tb();
parameter CLOCK_PERIOD = 10;
parameter LOOP_CYCLE = 100;
integer i;
reg [7:0] tb_data;
reg tb_ck;
reg tb_wen;
reg tb_ren;
reg tb_clr;
wire [7:0] tb_q;
wire tb_emp;
wire tb_full;
wire tb_aef;
wire tb_aff;
//module instantiation
FifoMacro fifo(
.Data(tb_data),
.WrClock(tb_ck),
.RdClock(tb_ck),
.WrEn(tb_wen),
.RdEn(tb_ren),
.Reset(tb_clr),
.RPReset(tb_clr),
.Q(tb_q),
.Empty(tb_emp),
.Full(tb_full),
.AlmostEmpty(tb_aef),
.AlmostFull(tb_aff)
);
//Behavior
always #(CLOCK_PERIOD/2) tb_ck = ~tb_ck;
initial begin
tb_data = 0;
tb_ck = 0;
tb_wen = 0;
tb_ren = 0;
tb_clr = 1;
@(negedge tb_ck) begin
tb_clr <= 0;
tb_wen <= 1;
end
//Write cycle
for(i=0; i<LOOP_CYCLE; i=i+1)begin
@(negedge tb_ck) begin
tb_data <= i % 256;
end
end
//Write cycle
@(negedge tb_ck) begin
tb_wen <= 0;
tb_ren <= 1;
end
for(i=0; i<LOOP_CYCLE; i=i+1)begin
@(negedge tb_ck) begin
tb_data <= i % 256;
end
end
$stop;
$finish;
end
endmodule
/* Verilog netlist generated by SCUBA Diamond_3.0_Production (94) */
/* Module Version: 5.5 */
/* C:\lscc\diamond\3.0\ispfpga\bin\nt\scuba.exe -w -n FifoMacro -lang verilog -synth synplify -bus_exp 7 -bb -arch xo2c00 -type ebfifo -depth 4096 -width 8 -rwidth 8 -regout -resetmode ASYNC -reset_rel ASYNC -no_enable -pe 256 -pf 3840 -e */
/* Tue Feb 25 21:38:17 2014 */
[FifoMacro.v] -> файл, автоматически сгенерированный IPExpress (модуль FIFO_DC)
`timescale 1 ns / 1 ps
module FifoMacro (Data, WrClock, RdClock, WrEn, RdEn, Reset, RPReset, Q,
Empty, Full, AlmostEmpty, AlmostFull)/* synthesis NGD_DRC_MASK=1 */;
input wire [7:0] Data;
input wire WrClock;
input wire RdClock;
input wire WrEn;
input wire RdEn;
input wire Reset;
input wire RPReset;
output wire [7:0] Q;
output wire Empty;
output wire Full;
output wire AlmostEmpty;
output wire AlmostFull;
wire Empty_int;
wire Full_int;
wire scuba_vhi;
wire scuba_vlo;
defparam FifoMacro_0_3.FULLPOINTER1 = "0b01111111111110" ;
defparam FifoMacro_0_3.FULLPOINTER = "0b10000000000000" ;
defparam FifoMacro_0_3.AFPOINTER1 = "0b01110111111110" ;
defparam FifoMacro_0_3.AFPOINTER = "0b01111000000000" ;
defparam FifoMacro_0_3.AEPOINTER1 = "0b00001000000010" ;
defparam FifoMacro_0_3.AEPOINTER = "0b00001000000000" ;
defparam FifoMacro_0_3.ASYNC_RESET_RELEASE = "ASYNC" ;
defparam FifoMacro_0_3.GSR = "DISABLED" ;
defparam FifoMacro_0_3.RESETMODE = "ASYNC" ;
defparam FifoMacro_0_3.REGMODE = "OUTREG" ;
defparam FifoMacro_0_3.CSDECODE_R = "0b11" ;
defparam FifoMacro_0_3.CSDECODE_W = "0b11" ;
defparam FifoMacro_0_3.DATA_WIDTH_R = 2 ;
defparam FifoMacro_0_3.DATA_WIDTH_W = 2 ;
FIFO8KB FifoMacro_0_3 (.DI0(scuba_vlo), .DI1(scuba_vlo), .DI2(Data[0]),
.DI3(scuba_vlo), .DI4(scuba_vlo), .DI5(Data[1]), .DI6(scuba_vlo),
.DI7(scuba_vlo), .DI8(scuba_vlo), .DI9(scuba_vlo), .DI10(scuba_vlo),
.DI11(Data[0]), .DI12(scuba_vlo), .DI13(scuba_vlo), .DI14(scuba_vlo),
.DI15(scuba_vlo), .DI16(scuba_vlo), .DI17(scuba_vlo), .CSW0(scuba_vhi),
.CSW1(scuba_vhi), .CSR0(RdEn), .CSR1(scuba_vhi), .FULLI(Full_int),
.EMPTYI(Empty_int), .WE(WrEn), .RE(scuba_vhi), .ORE(scuba_vhi),
.CLKW(WrClock), .CLKR(RdClock), .RST(Reset), .RPRST(RPReset), .DO0(Q[0]),
.DO1(Q[1]), .DO2(), .DO3(), .DO4(), .DO5(), .DO6(), .DO7(), .DO8(),
.DO9(), .DO10(), .DO11(), .DO12(), .DO13(), .DO14(), .DO15(), .DO16(),
.DO17(), .EF(Empty_int), .AEF(AlmostEmpty), .AFF(AlmostFull), .FF(Full_int));
defparam FifoMacro_1_2.FULLPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_1_2.FULLPOINTER = "0b11111111111110" ;
defparam FifoMacro_1_2.AFPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_1_2.AFPOINTER = "0b11111111111110" ;
defparam FifoMacro_1_2.AEPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_1_2.AEPOINTER = "0b11111111111110" ;
defparam FifoMacro_1_2.ASYNC_RESET_RELEASE = "ASYNC" ;
defparam FifoMacro_1_2.GSR = "DISABLED" ;
defparam FifoMacro_1_2.RESETMODE = "ASYNC" ;
defparam FifoMacro_1_2.REGMODE = "OUTREG" ;
defparam FifoMacro_1_2.CSDECODE_R = "0b11" ;
defparam FifoMacro_1_2.CSDECODE_W = "0b11" ;
defparam FifoMacro_1_2.DATA_WIDTH_R = 2 ;
defparam FifoMacro_1_2.DATA_WIDTH_W = 2 ;
FIFO8KB FifoMacro_1_2 (.DI0(scuba_vlo), .DI1(scuba_vlo), .DI2(Data[2]),
.DI3(scuba_vlo), .DI4(scuba_vlo), .DI5(Data[3]), .DI6(scuba_vlo),
.DI7(scuba_vlo), .DI8(scuba_vlo), .DI9(scuba_vlo), .DI10(scuba_vlo),
.DI11(Data[2]), .DI12(scuba_vlo), .DI13(scuba_vlo), .DI14(scuba_vlo),
.DI15(scuba_vlo), .DI16(scuba_vlo), .DI17(scuba_vlo), .CSW0(scuba_vhi),
.CSW1(scuba_vhi), .CSR0(RdEn), .CSR1(scuba_vhi), .FULLI(Full_int),
.EMPTYI(Empty_int), .WE(WrEn), .RE(scuba_vhi), .ORE(scuba_vhi),
.CLKW(WrClock), .CLKR(RdClock), .RST(Reset), .RPRST(RPReset), .DO0(Q[2]),
.DO1(Q[3]), .DO2(), .DO3(), .DO4(), .DO5(), .DO6(), .DO7(), .DO8(),
.DO9(), .DO10(), .DO11(), .DO12(), .DO13(), .DO14(), .DO15(), .DO16(),
.DO17(), .EF(), .AEF(), .AFF(), .FF());
defparam FifoMacro_2_1.FULLPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_2_1.FULLPOINTER = "0b11111111111110" ;
defparam FifoMacro_2_1.AFPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_2_1.AFPOINTER = "0b11111111111110" ;
defparam FifoMacro_2_1.AEPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_2_1.AEPOINTER = "0b11111111111110" ;
defparam FifoMacro_2_1.ASYNC_RESET_RELEASE = "ASYNC" ;
defparam FifoMacro_2_1.GSR = "DISABLED" ;
defparam FifoMacro_2_1.RESETMODE = "ASYNC" ;
defparam FifoMacro_2_1.REGMODE = "OUTREG" ;
defparam FifoMacro_2_1.CSDECODE_R = "0b11" ;
defparam FifoMacro_2_1.CSDECODE_W = "0b11" ;
defparam FifoMacro_2_1.DATA_WIDTH_R = 2 ;
defparam FifoMacro_2_1.DATA_WIDTH_W = 2 ;
FIFO8KB FifoMacro_2_1 (.DI0(scuba_vlo), .DI1(scuba_vlo), .DI2(Data[4]),
.DI3(scuba_vlo), .DI4(scuba_vlo), .DI5(Data[5]), .DI6(scuba_vlo),
.DI7(scuba_vlo), .DI8(scuba_vlo), .DI9(scuba_vlo), .DI10(scuba_vlo),
.DI11(Data[4]), .DI12(scuba_vlo), .DI13(scuba_vlo), .DI14(scuba_vlo),
.DI15(scuba_vlo), .DI16(scuba_vlo), .DI17(scuba_vlo), .CSW0(scuba_vhi),
.CSW1(scuba_vhi), .CSR0(RdEn), .CSR1(scuba_vhi), .FULLI(Full_int),
.EMPTYI(Empty_int), .WE(WrEn), .RE(scuba_vhi), .ORE(scuba_vhi),
.CLKW(WrClock), .CLKR(RdClock), .RST(Reset), .RPRST(RPReset), .DO0(Q[4]),
.DO1(Q[5]), .DO2(), .DO3(), .DO4(), .DO5(), .DO6(), .DO7(), .DO8(),
.DO9(), .DO10(), .DO11(), .DO12(), .DO13(), .DO14(), .DO15(), .DO16(),
.DO17(), .EF(), .AEF(), .AFF(), .FF());
VHI scuba_vhi_inst (.Z(scuba_vhi));
VLO scuba_vlo_inst (.Z(scuba_vlo));
defparam FifoMacro_3_0.FULLPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_3_0.FULLPOINTER = "0b11111111111110" ;
defparam FifoMacro_3_0.AFPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_3_0.AFPOINTER = "0b11111111111110" ;
defparam FifoMacro_3_0.AEPOINTER1 = "0b00000000000000" ;
defparam FifoMacro_3_0.AEPOINTER = "0b11111111111110" ;
defparam FifoMacro_3_0.ASYNC_RESET_RELEASE = "ASYNC" ;
defparam FifoMacro_3_0.GSR = "DISABLED" ;
defparam FifoMacro_3_0.RESETMODE = "ASYNC" ;
defparam FifoMacro_3_0.REGMODE = "OUTREG" ;
defparam FifoMacro_3_0.CSDECODE_R = "0b11" ;
defparam FifoMacro_3_0.CSDECODE_W = "0b11" ;
defparam FifoMacro_3_0.DATA_WIDTH_R = 2 ;
defparam FifoMacro_3_0.DATA_WIDTH_W = 2 ;
FIFO8KB FifoMacro_3_0 (.DI0(scuba_vlo), .DI1(scuba_vlo), .DI2(Data[6]),
.DI3(scuba_vlo), .DI4(scuba_vlo), .DI5(Data[7]), .DI6(scuba_vlo),
.DI7(scuba_vlo), .DI8(scuba_vlo), .DI9(scuba_vlo), .DI10(scuba_vlo),
.DI11(Data[6]), .DI12(scuba_vlo), .DI13(scuba_vlo), .DI14(scuba_vlo),
.DI15(scuba_vlo), .DI16(scuba_vlo), .DI17(scuba_vlo), .CSW0(scuba_vhi),
.CSW1(scuba_vhi), .CSR0(RdEn), .CSR1(scuba_vhi), .FULLI(Full_int),
.EMPTYI(Empty_int), .WE(WrEn), .RE(scuba_vhi), .ORE(scuba_vhi),
.CLKW(WrClock), .CLKR(RdClock), .RST(Reset), .RPRST(RPReset), .DO0(Q[6]),
.DO1(Q[7]), .DO2(), .DO3(), .DO4(), .DO5(), .DO6(), .DO7(), .DO8(),
.DO9(), .DO10(), .DO11(), .DO12(), .DO13(), .DO14(), .DO15(), .DO16(),
.DO17(), .EF(), .AEF(), .AFF(), .FF());
assign Empty = Empty_int;
assign Full = Full_int;
// exemplar begin
// exemplar end
endmodule
Среда разработки
Решетка Алмазная 3.0.0.97
Active-HDL версия 9.2
Целевое устройство: LCMXO2-1200ZE-1TG144C
1 ответ
Добавьте эти строки в свой тестовый стенд высшего уровня:
GSR GSR_INST (.GSR (<global reset sig>));
PUR PUR_INST (.PUR (<powerup reset sig>));
Посмотрите эту Решетчатую ПЛИС Как документировать: как использовать сигнал глобального набора / сброса (GSR)