Syntax verilog编译器错误:接近“”;:语法错误

Syntax verilog编译器错误:接近“”;:语法错误,syntax,verilog,Syntax,Verilog,编译时,在global\u vars gv处有一个语法错误 我不知道。我是否应该在verilog中初始化gv?,您不能这样做: timescale 1ns/10ps /* resource counter for nor gates */ module global_vars; integer count; endmodule module my_nor(y, a, b); output y; input a, b; global_vars gv; /* at in

编译时,在
global\u vars gv处有一个语法错误

我不知道。我是否应该在verilog中初始化
gv

,您不能这样做:

timescale 1ns/10ps

/* resource counter for nor gates
 */
module global_vars;
  integer count;
endmodule

module my_nor(y, a, b);
  output y;
  input a, b;

  global_vars gv;

  /* at instantiation increment the resources used */
  gv =gv +1;

  /* add 2ns inherent delay */
  nor #2 nor1(y,a,b); 
endmodule
wire
类型需要使用分配:

 gv = gv +1;
reg
类型可以使用
initial
always@*
always@(posedge clk)

你试图使用一个像变量一样的实例,我不确定你试图用你的全局变量做什么,可能是使它成为一个全局变量,但创建一个实例会使它成为局部变量而不是全局变量。在这里,您可以将gv设置为整数而不是实例

注 Wire赋值和
always@*
是组合的,赋值中没有时间延迟,因此值不能直接引用自身。比如说

gv=gv+1

是一个组合循环,你期望+1什么时候发生。这通常通过使gv成为触发器并在时钟边缘更新其值来解决:

always @* begin
  gv = a + b;
end
或对于使用复位的ASIC:

initial begin
  gv = 'b0;
end
always @(posedge clk) begin
  gv <= gv + 1;
end
始终@(posedge clk或negedge rst_n)开始
如果开始

gv看起来您正试图在可合成模块中嵌入对全局变量的引用,以便计算该模块被实例化的次数。正如@Morgan已经指出的,您不能将模块实例化为变量引用。但还有一个更根本的问题——你试图将行为代码(即全局变量)混合到可合成的代码中,但这根本不起作用

创建一个综合模块实际上是一个两步的过程——设计和编码。在设计阶段,你要弄清楚你想要创建什么样的逻辑。你不需要深入到门级,但你应该能够用组合逻辑、寄存器、FIFO、内存等来勾勒出函数。一旦你对语言有了一定的了解,这可能只是一个思维过程,而不是纸上谈兵,但是你仍然需要考虑你正在创造的逻辑。一旦你设计了你的电路,你就可以编写代码来实现你的设计


硬件中不存在全局变量。您可以创建一个可由多个模块访问的计数器,但它需要某种仲裁过程。但您要做的是创建一个运行时计数器,它统计实例化的模块数量,而没有硬件模拟。您可以使用“define”语句实例化可变数量的模块,并从每个模块获得一个信号,如果模块已实例化,则该信号定义为“1”;如果未实例化,则为“0”,然后计算“1”的数量,但这是自欺欺人的,因为在实例化模块之前,您必须定义一个宏来告诉您模块的数量!在这种情况下,您最好直接使用宏值,省去所有额外的信号

module global\u vars
中定义的变量似乎是
count
,但您在
my\u nor
中引用的变量似乎是
gv
。如果此观察结果有效,则您需要在
my\u nor
中使用
count
,或者需要在
global\u vars
中重命名
count
,或者需要将
gv
添加到
global\u vars
中。我试图重命名它,但没有成功。还是错误。我也使用了count,error。
always @(posedge clk) begin
  gv <= gv + 1;
end
initial begin
  gv = 'b0;
end
always @(posedge clk) begin
  gv <= gv + 1;
end
always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    gv <= 'b0;
  end
  else begin
    gv <= gv + 1;
  end
end