我正在写信询问如何在Verilog中声明全局变量。 parameter
和define
关键字声明的内容本质上是常量,而不是变量。
我需要以下内容:
`define Glitch
module Cell ( Shift_In, Shift_Out_Screwed, Clk );
input Clk, Shift_In;
output Shift_Out_Screwed;
wire Shift_Out_Screwed;
wire Shift_Out;
Inverter INV1 ( Shift_In, Shift_Out, Clk );
assign Shift_Out_Screwed = Glitch ? ~Shift_Out : Shift_Out
endmodule
这是非常简单的故障插入。当Glitch==1
时,原始输出反转。当Glitch==0
时,原始输出保持不变。我希望在[[external模拟testbench.v文件中定义信号Glitch
,尽管它已在此处声明和使用,并且我do n't想将信号Glitch
添加到输入中模块cell
的端口列表。这是因为我的真实电路是一个非常复杂的电路,如果我将输入端口添加到某个单元,则会影响许多其他单元。
module Cell ( Shift_In, Shift_Out_Screwed, Clk );
input Clk, Shift_In;
output Shift_Out_Screwed;
wire Shift_Out_Screwed;
wire Shift_Out;
Inverter INV1 ( Shift_In, Shift_Out, Clk );
`ifdef SIMULATION
// This logic is used in simulation, but not synthesis. Use care.
logic Glitch = 1'b0;
assign Shift_Out_Screwed = Glitch ? ~Shift_Out : Shift_Out
`else
// This logic is used in synthesis, but not simulation. Use care.
assign Shift_out_Screwed = Shift_out;
`endif
endmodule
注意,我使用“ SIMULATION”预处理器开关从合成中隐藏“ Glitch”错误注入。请谨慎使用此技术,以免造成仿真/合成不匹配。在测试台中,您可以通过参考设计层次结构中的“毛刺”信号在特定单元实例中引起毛刺,如下所示:
initial begin ... @(posedge Clk); #1; $top.u_foo.u_bar.u_cell.Glitch = 1'b1; @(posedge Clk); #1; $top.u_foo.u_bar.u_cell.Glitch = 1'b1; ... end
上面的代码片段将注入一个周期的“小故障”。作为替代:注入错误的更传统的方法是在测试台中使用“ force”语句来覆盖被测设备中的驱动器。