VHDL

Port 设置默认值

如下所示,std_logic 和 std_logic_vector 分别有不同的默认值设置形式

1
2
3
4
5
port(
aclr0 : in std_logic := '0';
aclr1 : in std_logic := '0';
address2_a : in std_logic_vector((widthad2_a - 1) downto 0) := ( others => '0');
address2_b : in std_logic_vector((widthad2_b - 1) downto 0) := ( others => '0');

避免被优化

以下这三者都可以,但具体使用哪个需要结合他们的差异来做判断

1
2
3
4
5
6
attribute syn_keep : boolean;
attribute mark_debug : string;
attribute dont_touch : string;
attribute syn_keep of DATA_ARR: signal is true;
attribute mark_debug of DATA_ARR: signal is "true";
attribute dont_touch of DATA_ARR: signal is "true";

差异对比:

  • 对于 dont_touch 属性,被常用于防止综合工具对特定的 wire 或者 module 进行任何优化,告诉综合工具”不要触碰“这个元素,保存原始的形态。
  • 对于 syn_keep 指令,这个指令是特定于综合的,被用来告诉综合工具保持某些信号或逻辑,主要目的是防止优化过程中的信号消除。
  • 对于 mark_debug 指令,通常与硬件调试相关,用于标记需要在后续调试中观察的信号。
    总结:
    如果说是为了保持信号或模块在综合过程中不变,dont_touch 是最好的选择。如果是为了确保在逻辑优化阶段某些信号不被移除,syn_keep 更合适。最后如果是涉及硬件调试的场景,那么 mark_debug 是首选。

目前不确定 dont_touch 是不是对于两种编译器都是适用的,能肯定的是 Xilinx 官方有明确的关于 dont_touch 的说明,而 Quartus 端目前能查到的是 keep attribute 的使用,两个链接都放在下面供参考

Verilog

wire signal 避免被优化

代码如下,具体差异上面已经介绍过不再赘述

1
(* syn_keep = "true", mark_debug = "true" *) wire signal;