verilog compiler error: near “;”: syntax error

verilog compiler error: near “;”: syntax error

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

当我编译时,global_vars gv;处有一个语法错误 我不知道。我应该在 gv 首字母缩写吗?

在 verilog 中你不能只这样做:

 gv = gv +1;

wire 类型需要使用 assign:

 wire   gv;
 assign gv = a + b;

reg 类型可以使用 initialalways @*always @(posedge clk).

always @* begin
  gv = a + b;
end

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

备注

线赋值和always @*是组合的,赋值是没有时间延迟的,因此值不能直接引用到自身。例如

gv = gv + 1;

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

always @(posedge clk) begin
  gv <= gv + 1;
end

在这种情况下您仍然需要为gv设置一个初始值。对于 FPGA,这可以使用 ASIC 的初始或异步重置来完成。

FPGA初始使用:

initial begin
  gv = 'b0;
end
always @(posedge clk) begin
  gv <= gv + 1;
end

或者对于使用重置的 ASIC:

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    gv <= 'b0;
  end
  else begin
    gv <= gv + 1;
  end
end

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

创建一个综合模块实际上是一个两步过程——设计然后编码。在设计阶段,您会弄清楚您要创建的逻辑类型。你不需要深入到门级,但你应该能够用组合逻辑、寄存器、FIFO、存储器等的云来勾勒出功能。一旦你对语言有了一定的熟悉,这可能严格是一个心理过程而不是纸上谈兵,但您仍然需要考虑您正在创建的逻辑。然后一旦你设计了你的电路,你实际上去编写代码来实现你的设计。

硬件中不存在全局变量。您可以制作一个可由多个模块访问的计数器,但它需要某种仲裁过程。但是你想要做的是创建一个 运行 时间计数器来计算实例化的模块数量,没有硬件模拟。您可以使用“定义语句来实例化可变数量的模块,并从每个模块发出一个信号,如果模块被实例化,则定义为“1”,如果未实例化,则定义为“0”,然后计算“1”的数量,但这是弄巧成拙,因为在实例化模块之前您已经必须定义一个宏来告诉您模块的数量!在这种情况下,您不妨直接使用宏值并省去所有额外的信号。