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
吗?
答案 0 :(得分:0)
在verilog中你不能这样做:
gv = gv +1;
wire
类型需要使用assign:
wire gv;
assign gv = a + b;
reg
种类型可以使用initial
,always @*
或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的数量,但这是自我失败,因为你已经必须定义一个宏,告诉你实例化它们之前的模块数量!在这种情况下,您可以直接使用宏值并省去所有额外信号。