Verilog仿真中带多路选择器、加法器、触发器的程序计数器无输出问题排查
Verilog程序计数器无输出问题修复方案
问题根因
- 端口定义错误:Program_counter模块的PC端口重复声明为inout和reg类型,PC为寄存器输出,不需要设置为双向端口
- 信号拼写错误:Program_counter模块实例化floper寄存器时,复位信号reset拼写为resest,复位信号连接完全失效,导致计数器无法完成初始化
- 数据类型不匹配:mux模块的输出y被定义为reg类型,但后续使用assign语句赋值,语法错误会导致电路行为异常
- 缺少仿真打印逻辑:测试平台没有添加输出打印语句,仿真过程不会输出PC值,表现为运行无结果
- 代码转义异常:floper模块中的非阻塞赋值符被转义为
<=,无法被仿真器识别 - 测试激励时序不全:测试用例末尾多组赋值未添加延时,仿真会直接结束,无法观察到后续数值变化
修复后完整代码
module Program_counter(clk, reset, PC_sel, Ext_imm, PC); input wire clk, reset, PC_sel; input wire [31:0] Ext_imm; output reg [31:0] PC; wire [31:0] PC_Next, PC_4, PC_Target; floper#(32) PCreg(clk, reset, PC_Next, PC); adder PCplus4(PC, 32'd4, PC_4); adder PCtarget(PC, Ext_imm, PC_Target); mux#(32) PCmux(PC_4, PC_Target, PC_sel, PC_Next); endmodule module TB_PC(); reg clk, reset, PC_sel; reg [31:0] Ext_imm; wire [31:0] PC; Program_counter testbench(clk, reset, PC_sel, Ext_imm, PC); always #5 clk=~clk; initial begin // 打印仿真输出 $monitor("Time=%0t | reset=%b | PC_sel=%b | Ext_imm=%h | PC=%h", $time, reset, PC_sel, Ext_imm, PC); clk=0; reset=0; PC_sel=0; #20 reset=1; #20 PC_sel=1; Ext_imm=32'h0000003A; #10 PC_sel=1; Ext_imm=32'h00000B3A; #10 PC_sel=0; Ext_imm=32'h0000DB3A; #100 $finish; end endmodule module adder(input [31:0] a, b, output [31:0] y); assign y = a + b; endmodule module floper#(parameter WIDTH = 8) (input wire CLK, reset, input wire [WIDTH-1:0] d, output reg [WIDTH-1:0] q); always@(posedge CLK, posedge reset) if (reset) q <= 0; else q <= d; endmodule module mux#(parameter WIDTH = 8) (input wire [WIDTH-1:0] d0, d1, input wire s, output wire [WIDTH-1:0] y); assign y= s ? d1 : d0; endmodule
运行说明
修复后运行仿真即可看到逐次打印的PC值,复位完成后PC会按照预期自增4,或者根据PC_sel选择跳转到立即数对应的目标地址。
内容的提问来源于stack exchange,提问作者Fawad Khan
相关产品推荐
相关产品推荐

