Vhdl Verilog在测试台上同时分配多个独立信号

Vhdl Verilog在测试台上同时分配多个独立信号,vhdl,verilog,Vhdl,Verilog,在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_vec

在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;
信号时钟:标准逻辑:='0';
信号计数输入:标准逻辑向量(3到0):=“0000”;
信号负载:标准逻辑:='0';
信号复位:标准逻辑:='0';
信号计数:标准逻辑向量(3到0):=“0000”;
...

clk我不太熟悉VHDL,但这看起来像是一个测试台刺激。我生成了可运行的测试用例以进行比较

Verilog等价物看起来类似于:

reg clk = 1'b0;
reg [3:0] count_in = 4'b0000;
reg load = 1'b0;
reg reset = 1'b0;
wire [3:0] count_out; // test bench is not driving this
...

initial begin
  clk <= #50 !clk;
  reset <= #1400 1'b1;
  reset <= #1900 1'b0;
  count_in <= #2500 4'b1010;
  load <= #2700 1'b1;
  load <= #3000 1'b0;
end

Verilog和System Verilog的工作示例我对VHDL不太熟悉,但这看起来像是一个测试台刺激。我生成了可运行的测试用例以进行比较

Verilog等价物看起来类似于:

reg clk = 1'b0;
reg [3:0] count_in = 4'b0000;
reg load = 1'b0;
reg reset = 1'b0;
wire [3:0] count_out; // test bench is not driving this
...

initial begin
  clk <= #50 !clk;
  reset <= #1400 1'b1;
  reset <= #1900 1'b0;
  count_in <= #2500 4'b1010;
  load <= #2700 1'b1;
  load <= #3000 1'b0;
end

Verilog和System Verilog的工作示例在Verilog 2001及更高版本中,您可以在声明时初始化变量,如VHDL。另一种有趣但可能不太常见的方法是将fork-join块与阻塞分配一起使用。在下面的代码中,fork-join块中的每一行都是独立并发执行的

module test;
    reg clk, load, reset;
  reg [3:0] count_in, count_out;
    initial 
    begin
        fork 
            begin clk   = 0;        while (1) #50 clk = ~clk;               end 
            begin count_in  = 0;    #2500 ; count_in = 4'b1010;             end
            begin load      = 0;    #2700 ; load = 1 ; #3000; load = 0;     end
            begin reset = 0;        #1400 ; reset = 1; #1900; reset = 1;    end
            count_out   = 0;
        join
    end
endmodule
工作实例


另外,请注意,代码中的clk信号只切换一次。我稍微修改了它,这样时钟就可以无休止地运行。

在Verilog 2001及更高版本中,您可以在声明时初始化变量,如VHDL。另一种有趣但可能不太常见的方法是将fork-join块与阻塞分配一起使用。在下面的代码中,fork-join块中的每一行都是独立并发执行的

module test;
    reg clk, load, reset;
  reg [3:0] count_in, count_out;
    initial 
    begin
        fork 
            begin clk   = 0;        while (1) #50 clk = ~clk;               end 
            begin count_in  = 0;    #2500 ; count_in = 4'b1010;             end
            begin load      = 0;    #2700 ; load = 1 ; #3000; load = 0;     end
            begin reset = 0;        #1400 ; reset = 1; #1900; reset = 1;    end
            count_out   = 0;
        join
    end
endmodule
工作实例


另外,请注意,代码中的clk信号只切换一次。我稍微修改了一下,这样时钟就可以无休止地运行了。

hmm。。我在VHDL中没有看到类似于fork-join的东西。我认为这是systemverilog特有的东西。据我所知,VHDL中没有fork-join,但它自Verilog-95以来就存在于Verilog中。SystemVerilog通过添加
join\u any
join\u none
对其进行了扩展。请注意,fork-join是一个非常强大的构造,但它不可合成,并且可能会使调试复杂化。。我在VHDL中没有看到类似于fork-join的东西。我认为这是systemverilog特有的东西。据我所知,VHDL中没有fork-join,但它自Verilog-95以来就存在于Verilog中。SystemVerilog通过添加
join\u any
join\u none
对其进行了扩展。请注意,fork-join是一个非常强大的构造,但它不可合成,并且可能会使调试复杂化。