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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9696|回复: 8

请教 SystemVerilog 高手

[复制链接]
发表于 2008-4-22 20:29:13 | 显示全部楼层 |阅读模式

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

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

x
小弟想用SystemVerilog验证一个复杂数模混合系统,目前打算是把模拟模块写成SV模型,模拟信号用real型数据传递。
但是现在出现了一个麻烦的问题,例如以下代码:

module AnalogT(VOUT[1:0]);
  output  VOUT[1:0];
  real    VOUT[1:0];
  
  assign  VOUT[1]  = 0.5;
  assign  VOUT[0]  = 0.8;
endmodule

module TEST;
timeunit 1ns;
reg    VSEL;
real   VIN[1:0];
real   VOUT;
AnalogT U1(VIN[1:0]);
initial #0    VSEL = 0;
always  #10   VSEL = ~VSEL;
assign  VOUT = VIN[VSEL];
endmodule

以上描述的是一个模拟的2选1信号选择器,这段代码在 modelsim6.3f 里编译通过,但是仿真的时候提示错误:

vsim -coverage -novopt work.TEST
# vsim -coverage -novopt work.TEST
# Loading sv_std.std
# Refreshing D:\ICProject\AnalogTest\work.TEST
# Loading work.TEST
# Refreshing D:\ICProject\AnalogTest\work.AnalogT
# ** Error: D:/ICProject/AnalogTest/AnalogTest.sv(13): Internal error: ../../../src/vlog/vgendecl.c(5943) typeof(d) != VAR_DECL || (var_typeOf(d) != t_real && var_typeOf(d) != t_event)
# ** Error: D:/ProgramFiles/Modelsim6.3f/win32/vlog failed.
# ** Error: Sub-invoking of D:\ProgramFiles\Modelsim6.3f\win32/vlog failed; return status = 1.
# ** Error: (vsim-3171) Could not find machine code for 'D:\ICProject\AnalogTest\work.AnalogT'.
# No such file or directory. (errno = ENOENT)
# Error loading design

这段代码我觉得特殊之处就是端口上使用了 real 型的非压缩数组,我本来也是想实现这么个功能。
以上例子只是一个简单模型,实际使用的时候数组宽度很大,所以把数组分开并不现实。
特此求助,希望高手们指点一二,或者给个好的建议避开real型数组用作端口。
先谢谢啦!
 楼主| 发表于 2008-4-22 20:50:04 | 显示全部楼层
如果代码改成如下:

module AnalogT(VOUT1,VOUT0);
  output  VOUT1,VOUT0;
  real    VOUT1,VOUT0;
  
  assign  VOUT1  = 0.5;
  assign  VOUT0  = 0.8;
endmodule
module TEST;
timeunit 1ns;
reg    VSEL;
real   VIN1,VIN0;
real   VOUT;
AnalogT U1(VIN1,VIN0);
initial #0    VSEL = 0;
always  #10   VSEL = ~VSEL;
assign  VOUT = (VSEL)? VIN1:VIN0;
endmodule

则可以仿真,而且结果正确(见图片附件)
1.GIF
 楼主| 发表于 2008-4-27 01:58:40 | 显示全部楼层
这个问题已经解决,方法就是端口列表里面不把数组表示出来,如下:
module AnalogT(VOUT);
  output  VOUT;
  real    VOUT[1:0];
  
  assign  VOUT[1]  = 0.5;
  assign  VOUT[0]  = 0.8;
endmodule

module TEST;
timeunit 1ns;
reg    VSEL;
real   VIN[1:0];
real   VOUT;
AnalogT U1(VIN);
initial #0    VSEL = 0;
always  #10   VSEL = ~VSEL;
assign  VOUT = VIN[VSEL];
endmodule

这样也可以仿真出来正确的结果

但是目前还有一个重要的问题,我要用传输门来传递模拟信号,当传输门关断的时候,输出应该处于高阻态,可是real型的怎么赋值为高阻呢?
发表于 2008-10-11 19:22:42 | 显示全部楼层
分开验证不就可以了?
发表于 2008-10-22 21:15:43 | 显示全部楼层
要是没有记错的话,real 型的变量应该是两值型的变量,默认值为0.0,你可以查查sv3.1

原文如下:
real1数据类型来自于Verilog-2001,与C语言中的double数据类型相同。shortreal数据类型是一个SystemVerilog数据类型,与C语言中的float数据类型相同。

既然这样的话,它应该是不可以置成高组态的
头像被屏蔽
发表于 2008-10-23 21:54:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2016-1-7 16:59:38 | 显示全部楼层
回复 3# xiaobenyi

楼主,你的问题解决了吗? real 类型可以输出高阻吗?
发表于 2016-1-7 17:00:30 | 显示全部楼层
回复 6# imana86

这个仁兄,支持是什么意思啊?
发表于 2016-1-16 04:58:00 | 显示全部楼层
real类型不能用来表示高阻。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-22 16:15 , Processed in 0.301508 second(s), 12 queries , Gzip On, Redis On.

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