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
类型可以使用 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
您似乎在尝试在可综合模块中嵌入对全局变量的引用,以便计算该模块已被实例化的次数。正如@Morgan 已经指出的那样,您不能将模块实例化引用为变量。但还有一个更根本的问题——您试图将行为代码(即全局变量)混合到可综合代码中,但这行不通。
创建一个综合模块实际上是一个两步过程——设计然后编码。在设计阶段,您会弄清楚您要创建的逻辑类型。你不需要深入到门级,但你应该能够用组合逻辑、寄存器、FIFO、存储器等的云来勾勒出功能。一旦你对语言有了一定的熟悉,这可能严格是一个心理过程而不是纸上谈兵,但您仍然需要考虑您正在创建的逻辑。然后一旦你设计了你的电路,你实际上去编写代码来实现你的设计。
硬件中不存在全局变量。您可以制作一个可由多个模块访问的计数器,但它需要某种仲裁过程。但是你想要做的是创建一个 运行 时间计数器来计算实例化的模块数量,没有硬件模拟。您可以使用“定义语句来实例化可变数量的模块,并从每个模块发出一个信号,如果模块被实例化,则定义为“1”,如果未实例化,则定义为“0”,然后计算“1”的数量,但这是弄巧成拙,因为在实例化模块之前您已经必须定义一个宏来告诉您模块的数量!在这种情况下,您不妨直接使用宏值并省去所有额外的信号。
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
类型可以使用 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
您似乎在尝试在可综合模块中嵌入对全局变量的引用,以便计算该模块已被实例化的次数。正如@Morgan 已经指出的那样,您不能将模块实例化引用为变量。但还有一个更根本的问题——您试图将行为代码(即全局变量)混合到可综合代码中,但这行不通。
创建一个综合模块实际上是一个两步过程——设计然后编码。在设计阶段,您会弄清楚您要创建的逻辑类型。你不需要深入到门级,但你应该能够用组合逻辑、寄存器、FIFO、存储器等的云来勾勒出功能。一旦你对语言有了一定的熟悉,这可能严格是一个心理过程而不是纸上谈兵,但您仍然需要考虑您正在创建的逻辑。然后一旦你设计了你的电路,你实际上去编写代码来实现你的设计。
硬件中不存在全局变量。您可以制作一个可由多个模块访问的计数器,但它需要某种仲裁过程。但是你想要做的是创建一个 运行 时间计数器来计算实例化的模块数量,没有硬件模拟。您可以使用“定义语句来实例化可变数量的模块,并从每个模块发出一个信号,如果模块被实例化,则定义为“1”,如果未实例化,则定义为“0”,然后计算“1”的数量,但这是弄巧成拙,因为在实例化模块之前您已经必须定义一个宏来告诉您模块的数量!在这种情况下,您不妨直接使用宏值并省去所有额外的信号。