You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让VHDL中force信号的修改在release后仍生效?

VHDL中如何让force修改的信号值在release后保留?

我在使用VHDL的force特性时发现,该特性仅能修改信号的当前值,且修改仅在force生效期间有效——除非控制该信号的进程执行了赋值操作,否则release后信号会恢复到之前的保存值。我想知道是否存在方法,让force直接修改信号的保存值,使得release后修改依然保留。

波形现象示例

设计中的alpha_value每1微秒更新一次:

  • 在0.5微秒执行release后,alpha_value从13变回0(因为期间没有进程对其赋值);
  • 在2.5微秒执行release后,alpha_value回到42(因为内部进程在2.0微秒已经将其改为42)。

更新后的完整示例代码

entity mdl is
  port(clk : in  boolean; alpha_out : out natural);
end entity;

architecture rtl of mdl is  -- 每微秒更新alpha_value/out的模块
  signal cntr         : natural := 0;
  signal alpha_value  : natural := 0;
  signal alpha_update : natural := 0;  -- alpha_value更新时递增
begin
  process (clk) is
  begin
    if rising_edge(clk) then
      cntr <= cntr + 1;
      if cntr = 99 then  -- 微秒计时点,递增alpha
        cntr         <= 0;
        alpha_value  <= alpha_value + 1;
        alpha_update <= alpha_update + 1;
      end if;
    end if;
  end process;
  alpha_out <= alpha_value;
end architecture;

entity tb is
end entity;

architecture sim of tb is
  signal clk                                           : boolean := true;  -- mdl时钟
  alias alpha_value is << signal .tb.mdl_e.alpha_value : natural >>;       -- mdl内部alpha_value
  signal alpha_out                                     : natural;          -- 模块输出
  signal alpha_force                                   : boolean;          -- 标记force是否作用于alpha_value
begin

  -- 生成100MHz时钟,每微秒100个时钟周期
  clk <= not clk after 5 ns;

  -- 例化模块
  mdl_e : entity work.mdl port map (clk => clk, alpha_out => alpha_out);

  -- 测试平台中的force进程
  process is
  begin
    -- 两次递增间施加force
    wait for 0.3 us;
    alpha_value <= force 13;  -- 0.3微秒至0.5微秒
    alpha_force <= true;
    wait for 0.2 us;
    alpha_value <= release;
    alpha_force <= false;
    -- 跨递增周期施加force
    wait for 1.0 us;
    alpha_value <= force 41;  -- 1.5微秒至2.5微秒
    alpha_force <= true;
    wait for 1.0 us;
    alpha_value <= release;
    alpha_force <= false;
    wait;
  end process;

end architecture;

2023-11-07更新:最初的简略示例代码

因过于简略无法体现真实场景,故替换为上述完整代码:

entity tb is
end entity;

architecture sim of tb is

  signal alpha_value  : natural;
  signal alpha_update : natural;  -- alpha_value更新时递增
  signal alpha_force  : boolean;  -- 标记force是否作用于alpha_value

begin

  -- 更新进程
  process is
  begin
    while true loop
      wait for 1.0 us;
      alpha_value  <= alpha_value + 1;
      alpha_update <= alpha_update + 1;
    end loop;
  end process;

  -- Force进程
  process is
  begin
    -- 两次递增间施加force
    wait for 0.3 us;
    alpha_value <= force 13;  -- 1至2微秒
    alpha_force <= true;
    wait for 0.2 us;
    alpha_value <= release;
    alpha_force <= false;
    -- 跨递增周期施加force
    wait for 1.0 us;
    alpha_value <= force 41;  -- 5至7微秒
    alpha_force <= true;
    wait for 1.0 us;
    alpha_value <= release;
    alpha_force <= false;
    wait;
  end process;

end architecture;

解决方案

1. 使用VHDL-2008的force deposit语法

VHDL-2008扩展了force语句,支持deposit模式——直接修改信号的保存值(即驱动源维护的内部值),而非仅覆盖当前显示值。修改测试平台中的force语句:

alpha_value <= force deposit 13;

执行release后,信号会保留deposit设置的值,而非恢复到之前的状态。

2. 触发驱动进程更新保存值

如果无法使用VHDL-2008,可以在release前触发控制信号的进程,让其用当前force的值更新保存值。例如:

  • 在设计中添加测试用端口,允许外部触发信号赋值;
  • 在测试平台force信号后,触发一次时钟上升沿(或进程的敏感事件),让进程执行赋值操作,从而更新保存值。

修改后的mdl实体示例:

entity mdl is
  port(
    clk : in boolean;
    alpha_out : out natural;
    test_set_val : in natural := 0;
    test_trigger : in boolean := false
  );
end entity;

architecture rtl of mdl is
  signal cntr         : natural := 0;
  signal alpha_value  : natural := 0;
  signal alpha_update : natural := 0;
begin
  process(clk) is
  begin
    if rising_edge(clk) then
      cntr <= cntr + 1;
      -- 优先响应测试触发,更新alpha_value保存值
      if test_trigger then
        alpha_value <= test_set_val;
        alpha_update <= alpha_update + 1;
        cntr <= 0;
      elsif cntr = 99 then
        cntr <= 0;
        alpha_value <= alpha_value + 1;
        alpha_update <= alpha_update + 1;
      end if;
    end if;
  end process;
  alpha_out <= alpha_value;
end architecture;

测试平台中配合使用:

wait for 0.3 us;
alpha_value <= force 13;
alpha_force <= true;
test_set_val <= 13;
test_trigger <= true;
wait for 10 ns; -- 等待时钟采样
test_trigger <= false;
wait for 0.19 us;
alpha_value <= release;
alpha_force <= false;

3. 使用仿真器特定命令

部分仿真器(如ModelSim)支持命令行或波形窗口的force -deposit选项,直接修改信号保存值:

force -deposit tb.mdl_e.alpha_value 13

执行release后,信号值会保留修改结果。


内容的提问来源于stack exchange,提问作者EquipDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:50:02