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

时间:2015-03-20 03:02:26

标签: syntax verilog

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吗?

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

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

创建合成模块实际上是一个两步过程 - 设计然后编码。在设计阶段,您要弄清楚您要创建的逻辑类型。你不需要下到门级,但是你应该能够用组合逻辑,寄存器,FIFO,记忆等云来勾勒出这个功能。一旦你熟悉了这门语言,这可能完全是一个心理过程,而不是致力于纸张的东西,但你仍然需要考虑你正在创造的逻辑。然后,一旦设计好电路,就可以编写代码来实现设计。

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