如何在Verilog中声明一个全局变量?

时间:2016-01-19 06:35:37

标签: variables verilog global

我写信询问如何在Verilog中声明一个全局变量。 parameterdefine关键字声明的内容基本上是常量,而不是变量。

我需要的是以下内容:

`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中声明一个全局变量?

1 个答案:

答案 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”语句覆盖被测设备中的驱动器。