1

所以我在某处看到了这个用于 DFF 测试平台的 VHDL 代码,但我不太明白。

1)为什么有5个案例?为什么不只有两个?当输入为0时,当输入为1时;2)他为什么如此随意地选择那些等待时间?似乎 12、28、2、10、20 ns 似乎是非常随机选择的。这背后的逻辑是什么?

architecture testbench of dff_tb is

signal T_din:  std_logic;
signal T_dclk:  std_logic;
signal T_qout:  std_logic;
signal T_nqout: std_logic;

component dff 
port ( din:   in std_logic;
     dclk:  in std_logic;
     qout:    out std_logic;
     nqout:  out std_logic
   );
end component;

begin

dut_dff: dff port map (T_din,T_dclk,T_qout,T_nqout);

process
begin
T_dclk <= '0';
wait for 5 ns;
T_dclk <= '1';
wait for 5 ns;
end process;

process 

variable err_cnt: integer := 0; 

begin
--case1
T_din <= '1';
wait for 12 ns;     
assert (T_qout='1') report "Error1!" severity error;

-- case 2
T_din <=  '0';   
wait for 28 ns;
assert (T_qout='0') report "Error2!" severity error;

-- case 3
T_din <= '1';            
wait for 2 ns;
assert (T_qout='0') report "Error3!" severity error;

-- case 4
T_din <= '0';
wait for 10 ns;
assert (T_qout='0') report "Error4!" severity error;

-- case 5
T_din <=  '1';    
wait for 20 ns;    
assert (T_qout='1') report "Error5!" severity error;   

wait;
end process;

end testbench;
4

2 回答 2

1

您必须仔细查看时钟。时钟每 5 ns 切换一次。

情况1

所以一开始DFF应该是'1'。

案例2

自开始后 15 ns 后,输出应为“0”,而不是 12 ns 后,这就是您必须检查的内容。

案例3

您将输入设置为“1”,但 DFF 不应对其做出反应,因为持续时间太短。

案例 4 & 案例 5

他们只是向您保证,在案例 3 之后,一切正常。同样,就像在案例 2 中一样,您可以检查 DFF 真正切换的时间。

如果您考虑测试 DFF,这个测试平台有点大。但是,如果您正在学习硬件描述和测试平台,那么在您开始实施更复杂和复杂的设计之前,最好了解您必须注意什么。尤其是如果你打算用它制造硅,那么做的测试永远不够:)

于 2014-05-17T14:03:16.767 回答
1

在下文中,案例 1、案例 2 到案例 5 由命名标记 A 到 E 表示:

dff_tb 波形

案例 1 检查 T_qout 在 T_clk 的下降沿没有更新,T_din = '1'。见标记 A。

情况 2(标记 B)检查 T_qout 在 T_clk 的下降沿没有更新,T_din = '0'。

(大约现在你会得到一个学生应该做 dff 的门级实现的印象)。

情况 3(标记 C)检查 T_qout 是否保持为“0”(当条件为 False 时发生断言),是否对 dff 进行计时。T_din 上的“1”不会导致输出改变。

案例 4(标记 D)检查 T_qout 是否针对 T_din 的相反值保持为“1”。

(这些似乎都在检查门级 dff 实现)。

案例 5(标记 E)似乎在检查主从边沿触发的 D 触发器是否没有振荡或“松弛”到原始状态。

测试台似乎特定于将 DFF 实现为门级模型的类分配。

现在的问题是,教师是否涵盖了所有可能导致学生出错的情况?

于 2014-05-17T21:46:48.697 回答