我写信询问如何在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
时,原始输出保持不变。我希望在外部模拟testbench.v文件中定义信号Glitch
,尽管它在此声明并使用,我不想要将信号Glitch
添加到模块cell
的输入端口列表中。这是因为我的实际电路非常复杂,如果我在某个单元格中添加一个输入端口,就会有很多其他单元受到影响。
有谁知道如何在Verilog中声明一个全局变量?
答案 0 :(得分:0)
您正在努力解决的问题,例如错误注入。您希望能够从测试平台内在输出端口上注入位错误。您可以这样做:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> args;
args.push_back("-l");
args.push_back("-z");
args.push_back("123,abc");
args.push_back("-d");
args.push_back("/dev/null");
for (auto it = std::begin(args); it != std::end(args); ++it) {
if ((*it).at(0) == '-') {
std::cout << "key = " << (*it).substr(1) << std::endl;
auto next = std::next(it);
if ((*next).at(0) == '-'){
continue;
}else{
std::cout << "value = " << *(++it) << std::endl;
}
}
}
return 0;
}
请注意,我使用“ SIMULATION”预处理器开关从合成中隐藏了“毛刺”错误注入。请谨慎使用此技术,以免造成仿真/合成不匹配。
在测试台中,您可以通过参考设计层次结构中的“毛刺”信号在特定单元实例中引起毛刺,如下所示:
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
上面的代码片段将注入一个“小故障”周期。
另一种选择:注入错误的更传统的方法是在测试台中使用“ force”语句覆盖被测设备中的驱动器。