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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 16052|回复: 23

[求助] 关于verilog的inout口的仿真问题

[复制链接]
发表于 2010-4-16 12:14:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ve8736 于 2010-4-16 12:22 编辑

我这两天用verilog编的arm7与CPLD总线连接的程序,编完后用Jlink查看过ARM收发的数据,总线是好使的,就是说源模块代码没问题。现在问题就出在编写testbench仿真总线inout口,能看到测试模块给源模块的总线输入数据,但是看不到总线输出数据。在网上找了下资料,发现有建议用"assign DATA = (~nWE)?treg_DATA:16'hzzzz;assign DATA_OUT=(~nOE)?DATA:16'hzzzz;"这种方式,通过treg_DATA输入数据,DATA_OUT观察输出数据,但是试验了发现不行,总线输出仍然是高阻态。后来在weizhiheng的这个帖子http://www.eetop.cn/bbs/thread-245831-1-1.html里找到另外一种方法,像这样reg [3:0] dirdata$inout$reg = 4'b0000;wire [3:0] dirdata = dirdata$inout$reg; ,通过dirdata 观察输出,但是发现也不行。所以只能上网求助大家了。我先粘贴源模块代码:

module lpcbus(clk,ADDR,DATA,nOE,nWE,nCS,led);
   input clk,nOE,nWE,nCS;
   output led;
   input [7:0]ADDR;
   inout [15:0]DATA;
   reg [15:0]DATAOUT;
   wire link_bus;
   assign link_bus=!nOE;
   assign DATA=(link_bus)?DATAOUT:16'hzzzz;
  
   reg [25:0]cnt;
   
always@(posedge clk) begin
    cnt<=cnt+1;
   end
   assign led=cnt[25];
   reg [15:0]ram,ram2;
   
always@(nWE or nCS or ADDR) begin
    if((nCS==0)&&(nWE==0)) begin
     case(ADDR)
      16'h55: begin ram<=DATA; end
      16'h77: begin ram2<=DATA; end
      default:begin end
     endcase
    end
   end
   
always@(nOE or nCS or ADDR) begin
    if((nCS==0)&&(nOE==0)) begin
     case(ADDR)
      16'h66: begin DATAOUT<=ram; end
      16'h88: begin DATAOUT<=ram2; end
      default: begin end
     endcase
    end
    else begin
     DATAOUT<=16'hzzzz;
    end
   end
endmodule


    功能及其简单,就是往0X55写数时,能从0x66里读出来,是用来测试总线用的,试验结果验证好用。
    下面是测试代码testbench和仿真波形图:

`timescale 1 ns/ 1 ns
module lpcbus_vlg_tst;
reg [7:0] ADDR;
reg [15:0] treg_DATA;
reg clk;
reg nCS;
reg nOE;
reg nWE;
                                    
wire [15:0] DATA;
wire [15:0] DATA_OUT;
wire led;
                  
assign DATA = (~nWE)?treg_DATA:16'hzzzz;
assign DATA_OUT=(~nOE)?DATA:16'hzzzz;
initial begin
clk=0; nWE=1; nOE=1; nCS=1;
end                                                
                                                
always #10 clk=~clk;
always begin
#50 ADDR=8'h55;treg_DATA=16'h1234; nWE=0; nCS=0;  
#50 nWE=1; nCS=1; treg_DATA=16'hzzzz;
#50 ADDR=8'h66; nOE=0; nCS=0;
#50 nOE=1; nCS=1;
#100 ;                                       
end            
lpcbus i1 (
.ADDR(ADDR),
.DATA(DATA),
.clk(clk),
.led(led),
.nCS(nCS),
.nOE(nOE),
.nWE(nWE)
);                     
endmodule

仿真波形如图所示:可以看到,第一种方式时总线输出为高阻态ZZZZ,见红线那部分。
1.JPG

然后我按照weizhiheng的方式改了下测试代码:

`timescale 1 ns/ 1 ns
module lpcbus_vlg_tst;
reg [7:0] ADDR;
reg clk;
reg nCS;
reg nOE;
reg nWE;
                                    
reg [15:0] DATA$inout$reg = 16'h0000;
wire [15:0] DATA = DATA$inout$reg;
wire led;
                  
initial begin
clk=0; nWE=1; nOE=1; nCS=1;
end                                                
                                                
always #10 clk=~clk;
always begin
#50 ADDR=8'h55;DATA$inout$reg=16'h1234; nWE=0; nCS=0;  
#50 nWE=1; nCS=1; DATA$inout$reg=16'hzzzz;
#50 ADDR=8'h66; nOE=0; nCS=0;
#50 nOE=1; nCS=1;
#50 ;                                       
end            
lpcbus i1 (
.ADDR(ADDR),
.DATA(DATA),
.clk(clk),
.led(led),
.nCS(nCS),
.nOE(nOE),
.nWE(nWE)
);                    
endmodule

仿真波形如下: 可以看到,DATA上面还是高阻态。
2.JPG


我把整个工程都已经粘贴出来了,麻烦大家帮看看是什么问题,多谢了
 楼主| 发表于 2010-4-16 16:28:38 | 显示全部楼层
自己顶起~
 楼主| 发表于 2010-4-16 19:12:36 | 显示全部楼层
好心人帮看下吧
发表于 2010-4-16 20:19:36 | 显示全部楼层
在你的nwe,ncs由H到L时,请确保DATA的数据不是高阻。
最好使用同步电路进行设计。
发表于 2010-4-16 20:28:31 | 显示全部楼层
tb里面实例化的时候用tri类型的net进行连接
发表于 2010-4-17 16:28:30 | 显示全部楼层
在module lpcbus 中,可以看到,你的双向口DATA在link_bus为1时作为输出,为0时作为输入。
在testbench中,将DATA定义为tri类型,
assign DATA = lpcbus_vlg_tst.i1.link_bus ? lpcbus_vlg_tst.i1.DATAOUT : treg_DATA;

不知道对不对,你试一下。
 楼主| 发表于 2010-4-17 17:07:17 | 显示全部楼层
5# xcykii

按照你的方法试了不行
 楼主| 发表于 2010-4-17 17:11:56 | 显示全部楼层
6# rosie_1128

按照你的方法试时,点开始仿真后报错,不能继续下去

Unresolved reference to 'DATAOUT' in lpcbus_vlg_tst.i1.DATAOUT
Unresolved reference to 'link_bus' in lpcbus_vlg_tst.i1.link_bus
发表于 2010-4-17 17:37:26 | 显示全部楼层
你的第一种testbench仿真结果中,DATAOUT的值在波形图中看是什么?
我是指这段代码中的:
always@(nOE or nCS or ADDR) begin
    if((nCS==0)&&(nOE==0)) begin
     case(ADDR)
      16'h66: begin DATAOUT<=ram; end
      16'h88: begin DATAOUT<=ram2; end
      default: begin end
     endcase
    end
    else begin
     DATAOUT<=16'hzzzz;
    end
   end
 楼主| 发表于 2010-4-17 18:07:00 | 显示全部楼层
本帖最后由 ve8736 于 2010-4-17 18:14 编辑

9# rosie_1128

你点击第一个图里看最后一个波形可以看到的,X状态(红色那部分波形)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-4-20 07:42 , Processed in 0.030127 second(s), 9 queries , Gzip On, Redis On.

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