如何动态更新标头

时间:2014-07-22 03:23:39

标签: c++ verilog system-verilog

有没有办法动态更改头文件?

头文件包含许多可用于模块的常量。但是,在我的应用程序中,必须经常手动更改某些常量。有没有办法自动更改值?

我尝试了以下方法。 1.使用C ++确定常量并将其写入头文件。 2.使用SV模块更新头文件。 在运行顶层模块之前,所有这些方法都需要额外的步骤 有没有办法在执行模拟器时更新头文件?

在以下header.v中包含NUM,它在模块main中使用。 NUM经常更改。

此问题也适用于其他语言,例如C ++或Java。

header.v:
`define NUM 256 //256 must be changed often

module top ();
    initial ...
    //instantiation
    main MAIN();

endmodule

//this module contains NUM
module main ();
    byte[0:`NUM - 1];

endmodule

2 个答案:

答案 0 :(得分:1)

C ++是一个compiled language,其中像stuff这样的常量在编译期间被翻译成机器语言(我知道它的原始描述,为了详细的理解,你可以参考进程地址空间和常量驻留在其中{{ 3}})。 如果要更改这些常量(或类似的东西),应重新编译代码。有些技术可以使用某些工具从输入文本文件生成自定义代码。但这不适用于您的方案。

我认为在您的情况下,配置文件是最佳匹配,您可以根据自定义定义参数。

答案 1 :(得分:1)

如果同一模拟中每个模块的不同,则应使用parameter代替`define

main #(parameter NUM) (/*portlist*/);
    // ...
    byte array [0:`NUM - 1]; // FYI 'byte' is a SystemVerilog keyword
    // ...
endmodule

大多数模拟支持从命令行传递一个定义,如果模拟中的值相同,则可以起作用,但每个模拟都不同。

  • +define+NUM=256
  • -define NUM=256
  • -D NUM=256

要减少重新定义的警告,请将`ifndef打包到header.v中的定义:

`ifndef NUM
  `define NUM 256 //256 must be changed often
`endif