如何让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
相关产品推荐
相关产品推荐

