在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3991|回复: 7

[求助] testbench 中for 循环中用= 还是<= ?

[复制链接]
发表于 2011-12-30 11:48:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 xilinx_zhao 于 2011-12-30 11:50 编辑

下面这段代码中,红色的如果替换成<=, 即非阻塞, 仿真结果有很大差别,这是怎么回事?
initial
begin
  for (i=6;i>=0;i=i-1)
    begin @(posedge clk); w_i=simarray ;
end
end
发表于 2011-12-30 12:27:03 | 显示全部楼层
一般都这样写:
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
 楼主| 发表于 2011-12-30 12:44:41 | 显示全部楼层
回复 2# vongy

这怎么可能? @(posedge clk) 被放于 for 循环之外,岂不是来一次clk,则整个for 都循环完了? 我试过了,不行。
发表于 2011-12-30 13:32:33 | 显示全部楼层
你这个是initial嘛
一个是一个cycle做一次,另一个是一个cycle 6次全部都完成。在initial里面我感觉区别不大。

你需要详细说一下需要产生什么样的激励
发表于 2011-12-31 10:40:56 | 显示全部楼层
仿真结果有什么差别呀?有图有真相
 楼主| 发表于 2011-12-31 13:41:44 | 显示全部楼层
模块代码如下:
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
 楼主| 发表于 2011-12-31 13:42:30 | 显示全部楼层
本帖最后由 xilinx_zhao 于 2011-12-31 13:48 编辑

模块代码如下:
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
发表于 2011-12-31 14:15:05 | 显示全部楼层
本帖最后由 huxiaokai2005 于 2011-12-31 14:17 编辑

防了一下,没差别呀,w_i和w_i0是我分别用阻塞和非阻塞赋值的结果
QQ截图20111231141612.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-1 10:50 , Processed in 0.020922 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表