能否在Xilinx Vivado测试台中模拟SYSCLK差分时钟?
VC707 FPGA差分时钟仿真驱动问题解决
问题核心
你在Vivado仿真中遇到的问题是:测试台里定义了SYSCLK_P和SYSCLK_N两个reg变量,但未对其进行有效驱动,且错误尝试用并发赋值(assign)给reg类型变量,导致"concurrent assignment to a non-net 'SYSCLK(P/N)' is not permitted"报错;同时原测试台仅生成了单端时钟w_clk,未关联到差分输入,使得顶层模块的IBUFGDS无有效输入,仿真无法运行。
解决方案
要正确驱动差分时钟输入,需在测试台的过程块(initial或always)中对SYSCLK_P和SYSCLK_N进行反相赋值,确保差分信号的正确性,同时避免用并发语句给reg变量赋值。
修改后的测试台代码
module main_tb(); reg SYSCLK_P; reg SYSCLK_N; wire [7:0] GPIO_LED; main DUT ( .SYSCLK_P(SYSCLK_P), .SYSCLK_N(SYSCLK_N), .GPIO_LED(GPIO_LED) ); // 生成200MHz差分时钟对 initial begin // 初始化差分对为相反电平 SYSCLK_P = 1'b0; SYSCLK_N = 1'b1; forever begin #2.5; // 200MHz时钟周期为5ns,半周期2.5ns SYSCLK_P = ~SYSCLK_P; SYSCLK_N = ~SYSCLK_N; end end endmodule
关键说明
- 差分信号驱动规则:差分时钟对必须保持严格反相,初始值设置为相反电平,翻转时同步操作,这样才能被IBUFGDS原语正确识别转换为单端时钟。
- reg变量赋值规则:reg类型变量只能在
initial或always等过程块内赋值,不能使用assign(并发赋值仅适用于wire类型),这是你之前报错的直接原因。 - 时钟生成优化:使用
initial块初始化时钟比原always块更合理,避免了重复初始化的逻辑问题,同时保证时钟从正确的初始状态开始翻转。
内容的提问来源于stack exchange,提问作者johnny_1010
相关产品推荐
相关产品推荐

