在Verilog中“未声明标识符”。任何人都知道我为什么会这样?

时间:2014-02-25 02:41:33

标签: verilog

一直在努力解决这个问题,但简短的搜索没有产生任何内容,Verilog语法指南似乎没有提供任何有用的信息。 我正在编译这两个Verilog文件以及另一个仅使用预制门(AND,OR,NAND,NOR和NOT)的文件。

// 2-to-4 Decoder implemented in structural verilog style.
module decoder_2_to_4 (B, A, G, Y0, Y1, Y2, Y3);
input B;
input A;
input G;
output Y0;
output Y1;
output Y2;
output Y3;
wire NOTB;
wire NOTA;

    // Structural verilog style.
NOT u1 (B,NOTB);
NOT u2 (A,NOTA);
AND3 u3 (NOTB,NOTA,G,Y0);
AND3 u4 (NOTB,A,G,Y1);
AND3 u5 (B,NOTA,G,Y2);
AND3 u6 (B,A,G,Y3);

endmodule

`timescale 1 ns / 100 ps

module test_fixture;
reg done;
//  reg [1:0] test_input;   //2 input
reg [2:0] test_input;   //3 input
wire f0, f1, f2, f3;        //Put output wires here

initial
begin
   $dumpfile("decoders.vcd"); // save waveforms in this file
   $dumpvars;                 // saves all waveforms

   // initialize done signal to 0
   done = 1'b0;
/*
//2 Input Test
   // test 00 case
   test_input[1] = 0;
   test_input[0] = 0;

   // wait 5 ns, then test 001 case
   #5 
   test_input[1] = 0;
   test_input[0] = 1;

   // wait another 5 ns, then test 010 case
   #5
   test_input[1] = 1;
   test_input[0] = 0;

   // wait another 5 ns, then test 011 case
   #5
   test_input[1] = 1;
   test_input[0] = 1;

   // Bogus kluge to extend simulation time for better viewing.
   #5 done = 1'b1;

   $finish;       // finished with simulation
end
*/
// 3 input test

   // test 000 case
   test_input[2] = 0;
   test_input[1] = 0;
   test_input[0] = 0;

   // wait 5 ns, then test 001 case
   #5 
   test_input[2] = 0;
   test_input[1] = 0;
   test_input[0] = 1;

   // wait another 5 ns, then test 010 case
   #5
   test_input[2] = 0;
   test_input[1] = 1;
   test_input[0] = 0;

   // wait another 5 ns, then test 011 case
   #5
   test_input[2] = 0;
   test_input[1] = 1;
   test_input[0] = 1;

   // wait another 5 ns, then test 100 case
   #5
   test_input[2] = 1;
   test_input[1] = 0;
   test_input[0] = 0;

   // wait another 5 ns, then test 101 case
   #5
   test_input[2] = 1;
   test_input[1] = 0;
   test_input[0] = 1;

   // wait another 5 ns, then test 110 case
   #5
   test_input[2] = 1;
   test_input[1] = 1;
   test_input[0] = 0;

   // wait another 5 ns, then test 111 case
   #5
   test_input[2] = 1;
   test_input[1] = 1;
   test_input[0] = 1;


// Instantiate circuit
decoder_2_to_4 u0 (test_input[2], test_input[1], test_input[0], f0, f1, f2, f3);
end
endmodule   // test_fixture

问题是,当我编译时,我收到以下错误:

Identifier (decoder_2_to_4) not declared
"test.v", 94:

syntax error
"test.v', 94: decoder_2_to_4 u0<-

有没有人知道我为什么会这样做?我真的不知道发生了什么,向正确的方向推动肯定会有所帮助。提前谢谢。

编辑:为了进一步确认编译错误,prebuilt_gates文件(未列出的文件)和Decoders.v(包含2到4解码器实现的文件)在没有test.v的情况下编译在一起就好了(第二个)发布的文件和错误记录的文件。) 问题绝对存在于某处。

1 个答案:

答案 0 :(得分:2)

电路不应在initial块内实例化。

// Instantiate circuit
decoder_2_to_4 u0 (test_input[2], test_input[1], test_input[0], f0, f1, f2, f3);
end
endmodule   // test_fixture

应该是:

end
// Instantiate circuit
decoder_2_to_4 u0 (test_input[2], test_input[1], test_input[0], f0, f1, f2, f3);
endmodule   // test_fixture

module只能在其他modulegenerated中实例化 - 块(和generate - 块只能在模块内实例化。以任何其他方式实例化模块是非法的,例如在initial - 块或always - 块内。

moduleinitialalwaystask内实例化function会尝试将module视为变量,其中不存在并给出错误。

实际规则本身在IEEE Std 1800-2012 附件A 中大肆宣传。查找附件A中使用的所有地点module_instantiation