微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > testbench 中for 循环中用= 还是<= ?

testbench 中for 循环中用= 还是<= ?

时间:10-02 整理:3721RD 点击:

下面这段代码中,红色的如果替换成<=, 即非阻塞, 仿真结果有很大差别,这是怎么回事?
initial
begin
  for (i=6;i>=0;i=i-1)
    begin @(posedge clk); w_i=simarray ;
end
end

一般都这样写:
always @(posedge clk) begin
    for (i=6;i>=0;i=i-1)
        w_i <= simarray;
end
如果只是initial
initial begin
    @(posedge clk);
     for (i=6;i>=0;i=i-1)
     w_i = simarray;   
end


这怎么可能? @(posedge clk) 被放于 for 循环之外,岂不是来一次clk,则整个for 都循环完了? 我试过了,不行。

你这个是initial嘛
一个是一个cycle做一次,另一个是一个cycle 6次全部都完成。在initial里面我感觉区别不大。
你需要详细说一下需要产生什么样的激励

仿真结果有什么差别呀?有图有真相

模块代码如下:
module simple_fsm (clk, rst_n,w_i,z_o);
    input clk;
    input rst_n;
    input w_i;
    output z_o;
   
    reg z_o;
    reg [1:0]current_state;
    reg [1:0] next_state;
    parameter idle=2'b01;
    parameter s0  =2'b10;
    parameter s1  =2'b11;
   
    always@(posedge clk)
    begin
        if (rst_n==1'b0)
        current_state<=idle;
        else
       current_state<= next_state;
    end
   
    always@(*)
    begin
        next_state=current_state;
        case (current_state)
            idle: if (w_i==1'b1) next_state=s0;
                       else next_state=idle;
            s0  : if (w_i==1'b1) next_state=s1;
                       else next_state=idle;
            s1  : if (w_i==1'b1) next_state=s1;
                       else next_state=idle;
            default  : next_state=idle;
        endcase
     end
   
    always@(posedge clk)
    begin
        if (!rst_n) z_o=1'b0;
        else
    case (current_state)  
        idle: z_o=1'b0;
        s0  : z_o=1'b0;
        s1  : z_o=1'b1;
        default  : z_o=1'b0;
    endcase
    end
endmodule
Testbench 如下:
module simple_fsm_tb ();
reg clk;
reg rst_n;
reg w_i;
integer i;
wire z_o;
event start;
reg  simarray [6:0] ;
always
#10 clk=~clk;
initial
begin
   clk=1'b0;
   rst_n=1'b1;
   #6 rst_n=~rst_n;
   #6 rst_n=~rst_n;
   -> start;
end
initial $readmemb("simarray.txt", simarray);
initial begin
@(start);
for (i=6;i>=0;i=i-1) begin @(posedge clk); w_i=simarray ;end //simarray;
//@(posedge clk); w_i<=1'b1;
//@(posedge clk); w_i<=1'b0;
//@(posedge clk); w_i<=1'b1;
//repeat(2) @(posedge clk) w_i=1'b0;
//repeat(2) @(posedge clk) w_i=1'b1;
//@(posedge clk); w_i<=1'b0;
end
initial $display ("Test control");
always begin   
@(posedge clk); if (z_o==1'b1) $display("got one");
end
simple_fsm simple_fsm_0 (
.clk (clk),
.rst_n(rst_n),
.w_i(w_i),
.z_o(z_o)
);
endmodule

模块代码如下:
module simple_fsm (clk, rst_n,w_i,z_o);
    input clk;
    input rst_n;
    input w_i;
    output z_o;
   
    reg z_o;
    reg [1:0]current_state;
    reg [1:0] next_state;
    parameter idle=2'b01;
    parameter s0  =2'b10;
    parameter s1  =2'b11;
   
    always@(posedge clk)
    begin
        if (rst_n==1'b0)
        current_state<=idle;
        else
       current_state<= next_state;
    end
   
    always@(*)
    begin
        next_state=current_state;
        case (current_state)
            idle: if (w_i==1'b1) next_state=s0;
                       else next_state=idle;
            s0  : if (w_i==1'b1) next_state=s1;
                       else next_state=idle;
            s1  : if (w_i==1'b1) next_state=s1;
                       else next_state=idle;
            default  : next_state=idle;
        endcase
     end
   
    always@(posedge clk)
    begin
        if (!rst_n) z_o=1'b0;
        else
    case (current_state)  
        idle: z_o=1'b0;
        s0  : z_o=1'b0;
        s1  : z_o=1'b1;
        default  : z_o=1'b0;
    endcase
    end
endmodule
Testbench 如下,请把红色的改成非阻塞,仿真结果不一样,这是怎么回事:
module simple_fsm_tb ();
reg clk;
reg rst_n;
reg w_i;
integer i;
wire z_o;
event start;
reg  simarray [6:0] ;
always
#10 clk=~clk;
initial
begin
   clk=1'b0;
   rst_n=1'b1;
   #6 rst_n=~rst_n;
   #6 rst_n=~rst_n;
   -> start;
end
initial $readmemb("simarray.txt", simarray);
initial begin
@(start);
for (i=6;i>=0;i=i-1) begin @(posedge clk); w_i=simarray [ i ];end ;
//@(posedge clk); w_i<=1'b1;
//@(posedge clk); w_i<=1'b0;
//@(posedge clk); w_i<=1'b1;
//repeat(2) @(posedge clk) w_i=1'b0;
//repeat(2) @(posedge clk) w_i=1'b1;
//@(posedge clk); w_i<=1'b0;
end
initial $display ("Test control");
always begin   
@(posedge clk); if (z_o==1'b1) $display("got one");
end
simple_fsm simple_fsm_0 (
.clk (clk),
.rst_n(rst_n),
.w_i(w_i),
.z_o(z_o)
);
endmodule

防了一下,没差别呀,w_i和w_i0是我分别用阻塞和非阻塞赋值的结果


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top