Verilog'分配'声明

时间:2014-01-09 20:31:30

标签: verilog

verilog的新手,所以这可能是一个愚蠢的问题?在将“输入”网络分配给“输出”网络时是否应该考虑是否存在任何问题,或者这是不可能的?例如:

module TOP( CLK1, CLK2 );

    input CLK1;  
    output CLK2;

    assign CLK2 = CLK1;

endmodule

假设CLK1是50MHz时钟,仍然有效?

4 个答案:

答案 0 :(得分:3)

是的,这是有效的。实际上,您正在描述最简单的模块:只有一条线连接CLK1CLK2。像这样:

               TOP
        +---------------+
        |               | 
CLK1    |               |
------->-.....          |
        |    .          |
        |    .          |
CLK2    |    .          |
-------<-.....          | 
        |               |
        |               | 
        +---------------+

合成时,您只需要记住合成器为从CLK1CLK2传播信号所计算的延迟。当然,假设合成器实际上构建了这个模块。如果这个模块是更大设计的一部分,合成器可能(并且肯定会)在优化过程中吸收它。

无论是否对其进行优化,从CLK1CLK2的路径必须存在,并且该路径将具有延迟,这将取决于发出信号的{{1}的宏单元/ CLB的位置{{ 1}}和CLK1都在,它们将决定路由器构建的物理路径(使用更多的宏单元,CLB,BUFG或您的设备拥有的任何资源),您正在合成的设备的技术等等。

答案 1 :(得分:1)

你有效地将它们连接在一起仍然有效。

如果您可以使用verilog-2001,那么您可以定义为:

module TOP(
  input  CLK1,  
  output CLK2
);

  assign CLK2 = CLK1;

endmodule

或定义为注册类型:

module TOP(
  input      CLK1,  
  output reg CLK2
);

  always @* begin
    CLK2 = CLK1;
  end

endmodule

答案 2 :(得分:1)

您编写的代码不包含时间或延迟的概念。 CLK1可能是50GHz,它仍然有效。

如果你真的在询问它是否可以合成功能正确的硬件,那就另当别论了。如果你正在合成一个现代FPGA,那么很可能它会正常工作。事实上,即使是平庸的合成器也只是将您的模块优化为电线。

如果要正确模拟Verilog,则需要担心测试平台中的timespec说明符。此命令设置模拟的时间分辨率,因此您需要确保模拟器将看到时钟信号的变化。典型的默认分辨率为1ns,因此您可以再次使用。

对于模拟,您还可以确保添加到代码中的任何#delay值与所需的时钟频率兼容。

答案 3 :(得分:1)

Verilog端口方向基本上是建议性的(与VHDL不同,它们是强制执行的)。您甚至可以写入输入端口。你可以做任何你想做的事情,虽然合成器有望捕获一些没有意义的东西。我这里没有LRM,但是查看端口方向强制。