modelsim 模拟中缓冲区的奇怪行为

问题描述 投票:0回答:1

最近我遇到了问题,模拟中的缓冲区无法按我的预期工作。 我尝试了一些测试并得到了以下结果。 我在 Verilog 中创建了代码,以不同的方式生成两个缓冲区:

module buffer(
    input wire clk,
    input wire ena,
    output wire buffer,
    output wire buffer2
);
reg buffer_reg = 1'b0;
reg buffer_next = 1'b0;
reg buffer2_reg = 1'b0;

assign buffer = buffer_reg;
assign buffer2 = buffer2_reg;

always @(*) begin
    buffer_next = ena;
end

always @(posedge clk) begin
    buffer_reg <= buffer_next;
    buffer2_reg <= ena;
end
endmodule

然后我使用以下测试平台在 modelsim 中对其进行模拟:

`timescale 1ns / 1ns
module buffer_tb();

localparam CLK_CYCLE = 8;

reg clk;
reg ena;
wire buffer;
wire buffer2;

buffer dut(
    .clk(clk),
    .ena(ena),
    .buffer(buffer),
    .buffer2(buffer2)
);

// Clock generation
initial begin
    clk = 1'b0;
end

always #(CLK_CYCLE/2) clk = ~clk;

// Test sequence
initial begin
    // Initialize signals
    ena = 0;

    // change ena values based on the posedge clk
    @(posedge clk) ena = 1;
    @(posedge clk) ena = 0;
        
    repeat(5) @(posedge clk);
        
    @(posedge clk) ena = 1;
    @(posedge clk) ena = 0;
    
    
    repeat(2) #CLK_CYCLE;
    
    // change ena values based on the CLK_CYCLE
    #(CLK_CYCLE) ena = 1;
    #CLK_CYCLE ena = 0;
  
    repeat(5) #CLK_CYCLE;
  
    #CLK_CYCLE ena = 1;
    #CLK_CYCLE ena = 0;

    // Allow simulation to run for a while
    #50 $stop;   // Stop simulation
end
endmodule 

我在模拟中得到以下结果: simulation of buffers in modelsim

有人可以解释为什么当我使用

buffer2
和使用
posedge clk
时,我会得到不同的结果吗?
    

verilog delay system-verilog modelsim test-bench
1个回答
0
投票

如果要对同步行为进行建模,则需要以与驱动设计中的

CLK_CYCLE

信号相同的方式驱动设计输入信号,即:


    buffer
  • 使用非阻塞赋值 (
  • @(posedge clk)
  • )
    
    
  • 更改测试平台代码:

<=

	
© www.soinside.com 2019 - 2024. All rights reserved.