打印
[FPGA]

下面这段Verilog语言代码,怎么写testbench的测试代码?

[复制链接]
1735|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a438338076|  楼主 | 2021-4-30 00:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 a438338076 于 2021-4-30 00:46 编辑

本人看了两天,自己写了几遍,还是出错,希望有大神来帮我解决下这个仿真问题module delay(
    input               clk         ,//时钟信号
    input               rst_n       ,//全局复位信号,低有效
    input               din         ,//输入信号
    input [7:0]         dly_data    ,
    output reg         dout
);

wire            add_cnt         ;
wire            end_cnt         ;

reg [7:0]       dly_data_reg    ;
reg [2:0]       din_ff          ;   
reg             pos_flag        ;
reg             neg_flag        ;
reg [7:0]       cnt             ;


always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        dly_data_reg <= 'd0;
    end
    else begin
        dly_data_reg <= dly_data;
    end
end

always  @(posedge clk)begin
    din_ff <= {din_ff[1:0],din};
end

//上升沿
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        pos_flag <= 1'b0;
    end
    else if(end_cnt)begin
        pos_flag <= 1'b0;
    end
    else if(pos_flag == 1'b0 &&din_ff[2:1] == 2'b01)begin
        pos_flag <= 1'b1;
    end   
end

//下降沿
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        neg_flag <= 1'b0;
    end
    else if(end_cnt)begin
        neg_flag <= 1'b0;
    end
    else if(neg_flag == 1'b0 &&din_ff[2:1] == 2'b10)begin
        neg_flag <= 1'b1;
    end   
end

//延迟值
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 0;
        else
            cnt <= cnt + 1'b1;
    end
end

assign add_cnt = pos_flag || neg_flag;      
assign end_cnt = add_cnt && cnt == dly_data_reg -1;   

always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        dout <= 1'b0;
    end
    else if(pos_flag && end_cnt)begin//上升沿来了
        dout <= 1'b1;
    end
    else if(neg_flag && end_cnt)begin//下降沿来了
        dout <= 1'b0;
    end
end

endmodule

使用特权

评论回复

相关帖子

沙发
a438338076|  楼主 | 2021-4-30 00:45 | 只看该作者

下面这段Verilog语言代码,怎么写testbench的测试代码?

module delay(
    input               clk         ,//时钟信号
    input               rst_n       ,//全局复位信号,低有效
    input               din         ,//输入信号
    input [7:0]         dly_data    ,
    output reg         dout
);

wire            add_cnt         ;
wire            end_cnt         ;

reg [7:0]       dly_data_reg    ;
reg [2:0]       din_ff          ;   
reg             pos_flag        ;
reg             neg_flag        ;
reg [7:0]       cnt             ;


always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        dly_data_reg <= 'd0;
    end
    else begin
        dly_data_reg <= dly_data;
    end
end

always  @(posedge clk)begin
    din_ff <= {din_ff[1:0],din};
end

//上升沿
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        pos_flag <= 1'b0;
    end
    else if(end_cnt)begin
        pos_flag <= 1'b0;
    end
    else if(pos_flag == 1'b0 &&din_ff[2:1] == 2'b01)begin
        pos_flag <= 1'b1;
    end   
end

//下降沿
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        neg_flag <= 1'b0;
    end
    else if(end_cnt)begin
        neg_flag <= 1'b0;
    end
    else if(neg_flag == 1'b0 &&din_ff[2:1] == 2'b10)begin
        neg_flag <= 1'b1;
    end   
end

//延迟值
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 0;
        else
            cnt <= cnt + 1'b1;
    end
end

assign add_cnt = pos_flag || neg_flag;      
assign end_cnt = add_cnt && cnt == dly_data_reg -1;   

always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        dout <= 1'b0;
    end
    else if(pos_flag && end_cnt)begin//上升沿来了
        dout <= 1'b1;
    end
    else if(neg_flag && end_cnt)begin//下降沿来了
        dout <= 1'b0;
    end
end

endmodule

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

0

粉丝