Verilog调试求助:ld_tx_data_scope信号无法按预期拉高
UART代码调试问题解决
问题根源分析
你的ld_tx_data_scope信号始终未拉高,核心原因有三点:
- 寄存器无初始化/复位:
ld_tx_counter_debug、ld_tx_toggle、ld_tx_data_scope_uptime等寄存器在仿真初始状态为未知值x,导致ld_tx_counter_debug == 5这类条件判断永远不成立,无法触发ld_tx_data置1。 - 错误的组合逻辑写法:第一个无敏感列表的
always块属于非法组合逻辑定义,且使用非阻塞赋值<=,易引发驱动冲突或综合异常。 - 赋值风格不统一:时序块中混用阻塞赋值
=和非阻塞赋值<=,可能导致仿真与硬件行为不一致。
修正后的代码
module Uart_Proj( clk_50, tx_out, tx_empty, uld_rx_data, rx_in, rx_empty, my_rx_data, reset, my_rx_clk, my_tx_clk, ld_tx_data_scope ); input clk_50; reg ld_tx_data; input uld_rx_data; input rx_in; input reset; output tx_out; output rx_empty; output wire [7:0] my_rx_data; output tx_empty; output reg ld_tx_data_scope; output wire my_rx_clk; output wire my_tx_clk; reg tx_enable; reg [7:0] my_tx_data; reg rx_enable; reg [16:0] ld_tx_counter_debug; //for debugging reg ld_tx_toggle; reg [16:0] ld_tx_data_scope_uptime; // 修正组合逻辑:添加敏感列表,使用阻塞赋值 always @* begin tx_enable = 1; rx_enable = 0; my_tx_data = 8'b01010101; ld_tx_data_scope = ld_tx_data; end // 修正时序逻辑:添加复位,统一非阻塞赋值 always@(posedge clk_50 or posedge reset) begin if(reset) begin ld_tx_counter_debug <= 17'd0; ld_tx_data <= 1'b0; ld_tx_toggle <= 1'b0; ld_tx_data_scope_uptime <= 17'd0; end else begin ld_tx_counter_debug <= ld_tx_counter_debug + 17'd1; if(ld_tx_counter_debug == 17'd5 && ld_tx_toggle == 1'b0) begin ld_tx_counter_debug <= 17'd0; ld_tx_data <= 1'b1; ld_tx_toggle <= 1'b1; end if (ld_tx_toggle == 1'b1) begin ld_tx_data_scope_uptime <= ld_tx_data_scope_uptime + 17'd1; if (ld_tx_data_scope_uptime == 17'd5) begin ld_tx_data <= 1'b0; ld_tx_data_scope_uptime <= 17'd0; end end end end Baud_Generator inst_BG( .clk(clk_50), .txclk(my_tx_clk), .rxclk(my_rx_clk) ); uart inst_uart( .reset(reset), .txclk(my_tx_clk), .ld_tx_data(ld_tx_data), .tx_data(my_tx_data), .tx_enable(tx_enable), .tx_out(tx_out), .tx_empty(tx_empty), .rxclk(my_tx_clk), .uld_rx_data(uld_rx_data), .rx_data(my_rx_data), .rx_enable(rx_enable), .rx_in(rx_in), .rx_empty(rx_empty) ); endmodule
关键修改说明
- 复位逻辑:在时序块中添加复位分支,将所有控制寄存器初始化为0,确保启动后状态明确,解决仿真初始值未知的问题。
- 组合逻辑修正:将无敏感列表的
always块改为always @*组合逻辑块,使用阻塞赋值,符合Verilog编码规范,避免锁存器生成。 - 赋值风格统一:时序块内全部使用非阻塞赋值
<=,保证时序逻辑的仿真与综合行为一致。
内容的提问来源于stack exchange,提问作者programmer25
相关产品推荐
相关产品推荐

