在VHDL中,我可以在我的测试平台中写这个:
signal clk : std_logic := '0';
signal count_in : std_logic_vector(3 downto 0) := "0000";
signal load : std_logic := '0';
signal reset : std_logic := '0';
signal count_out : std_logic_vector(3 downto 0) := "0000";
...
clk <= not clk after 50 ns;
reset <= '1' after 1400 ns, '0' after 1900 ns;
count_in <= "1010" after 2500 ns;
load <= '1' after 2700 ns, '0' after 3000 ns;
信号声明在测试平台架构的“开始”之前,而elipse之后的部分在测试平台架构的主体中 . 更好的方法是在编写测试平台时使用以“wait”语句结尾的进程 . 我理解如何在verilog和VHDL中执行此操作 .
在verilog中,我们可以有一个初始块,它可以赋值一次 . 也可以有多个初始块 . 我没有试过这个,但我不认为从多个初始块驱动相同的信号是明智的 .
现在我的问题是,如何将DUT激励的上述代码转换为Verilog?我希望我将使用带有多个#delay值的assign语句 . 那是对的吗?我该怎么做?
2 回答
在Verilog 2001及更高版本中,您可以在声明时初始化变量,如VHDL . 另一个有趣但可能不那么常见的方法是使用带有阻塞赋值的fork-join块 . 在以下代码中,fork-join块中的每一行都是独立执行的 .
edaplayground上的工作示例 .
另外,请注意代码中的clk信号只能切换一次 . 我稍微修改了它,以便时钟无休止地运行 .
我对VHDL不太熟悉,但这看起来像是一个测试平台刺激 . 我为比较here生成了可运行的测试用例 .
Verilog等价物看起来像:
这将产生相同的波形,除了
count_out
浮动而不是全零 . 根据命名约定,我认为count_out
应该由被测器件驱动,该器件需要是线型 .SystemVerilog可能看起来像:
Verilog和System Verilog的工作示例here