什么是适当的方式来增加延迟,例如74HCT151,verilog模型,使其精确到数据表?
为74hct151型号添加延迟的正确方法是什么?见下文。 另请参见我在解决方案方面的努力 我希望看到一个7400计时的完全准确(尽可能)的verilog模型,这样我就可以理解这些问题并构建自己的模型。74151很有趣,因为Y和_Y路径有不同的时间,也因为它是我自制的“TTL”cpu所需要的最新路径 我正在使用Icarus,所以我需要一个解决方案。我没有其他工具,而且我知道有些工具有bug/怪癖/缺少功能,所以在商业工具上工作但在Icarus上不工作是一个问题 我希望有人能给我一个解决方案,这样我就可以学习了 下面我确实有一个解决方案,但我认为它可能有点不对劲 我想要一个设计,允许通过现实的小故障。但我以前的尝试抑制短期小故障,因为我是如何做延迟。我认为这被称为“传输延迟”,而不是“惯性延迟” 如以下文件所述,使用传输延迟有助于发现故障风险。。第4.3节 _ 在正确延迟的情况下,由于S和I传播延迟的差异,我预计在某些转换期间Y/_Y上会出现转换故障 数据表上说这个芯片在转换过程中会出现小故障,这在我的最佳计时镜头中就可以看到什么是适当的方式来增加延迟,例如74HCT151,verilog模型,使其精确到数据表?,verilog,delay,system-verilog,Verilog,Delay,System Verilog,为74hct151型号添加延迟的正确方法是什么?见下文。 另请参见我在解决方案方面的努力 我希望看到一个7400计时的完全准确(尽可能)的verilog模型,这样我就可以理解这些问题并构建自己的模型。74151很有趣,因为Y和_Y路径有不同的时间,也因为它是我自制的“TTL”cpu所需要的最新路径 我正在使用Icarus,所以我需要一个解决方案。我没有其他工具,而且我知道有些工具有bug/怪癖/缺少功能,所以在商业工具上工作但在Icarus上不工作是一个问题 我希望有人能给我一个解决方案,这样我
These needed delays are taken from datasheet for HCT in ns
I to Y = 19
I to _Y = 19
S to Y = 20
S to _Y = 20
_E to Y = 16
_E to _Y = 18
transition time Y, _Y = 7
另见
下面的基本代码没有延迟
如何正确实施
有关我的新手解决方案,请参见上面的链接
我希望有一种更惯用的方法来获取这些时间
这是基本逻辑,没有延迟
`timescale 1ns/1ns
module hct74151(_E, I, S, Y, _Y);
output Y, _Y;
input [2:0] S;
input [7:0] I;
input _E;
wire o =
(S==0 & I[0]) ||
(S==1 & I[1]) ||
(S==2 & I[2]) ||
(S==3 & I[3]) ||
(S==4 & I[4]) ||
(S==5 & I[5]) ||
(S==6 & I[6]) ||
(S==7 & I[7]);
assign Y = _E==0 ? o : 0;
assign _Y = !Y;
always @* begin
$display("%9t %m ", $time, "_E=%1b I=%8b S=%1d Y=%b _Y=%b ", _E, I, S, Y, _Y);
end
endmodule
:这是我的解决方案,但它是惯用的吗? 有没有更好的方法可以应用于伊卡洛斯
模块hct74151(_E,I,S,Y,_Y);
参数LOG=0;
输出Y,_Y;
输入[2:0]S;
输入[7:0]I;
输入;;
//设置定时是根据数据PD延迟信号,然后在最后一分钟将其合并
逻辑[7:0]Id;
逻辑[2:0]Sd;
总是@*
Id Y
逻辑教育,教育;
总是@*
_Ed你在找specify
block吗?顺便说一句,我用的是Icarus verilog。我不相信至少用Icarus用specify block可以做到这一点。我希望所有的小故障都能解决,而不是被抑制。但是,左手边的延迟方法看起来像一个低通滤波器,因此输入端上比传播延迟短的波动被抑制。然而,我想要一个像真正的芯片一样工作的模型,最坏的情况是出现大量的小故障。Icarus位不相关-它只是另一个V2K5模拟器。话虽如此,我自己使用specify
的经验是,不同的模拟器对它的处理方式略有不同,因此我不使用它,我同意您应该手动编写模型代码。请看一个我自己的手动编码,带有惯性延迟的例子,以及其他你应该考虑的东西。你不希望“所有的故障都通过”——这不是真正的硅是如何工作的。真正的设备可能会出故障,也可能不会出故障,这取决于技术和时间,但数据表只是涵盖了它本身:你应该假设出了故障,但如果它没有发生,你不会感到惊讶。但让所有故障通过是最坏的情况吗?如果一个小故障能帮助我在构建之前理解设计的风险,我宁愿让它消失。顺便说一下,这是一个家庭自制的“TTL CPU”(实际上是CMOS)的模拟,所以我认为考虑最坏的情况是有帮助的。HCT或HC将通过的短路电流是多少?它肯定不会是皮秒(笑话),但它是1秒还是2秒还是5秒?我想,少于上升时间可能接近极限,但有什么想法吗?我真的在试图理解如何构建真实的模型。顺便说一句,我对Icarus的评论是基于这样一个事实,即各种工具都有一些怪癖、bug和未实现的特性。不幸的是,我只有免费的伊卡洛斯。顺便说一句,我在伊卡洛斯报道了一些关于计时的问题,他们似乎反应很快,所以这就是问题所在。我正在尝试为我的TTL芯片的测试套件添加计时
module hct74151(_E, I, S, Y, _Y);
parameter LOG=0;
output Y, _Y;
input [2:0] S;
input [7:0] I;
input _E;
// setup timing be delaying the signals according to the data PD then combine them at last minute
logic [7:0] Id;
logic [2:0] Sd;
always @*
Id <= #(19) I;
always @*
Sd <= #(20) S;
// according to nexperia _E->_Y is slower than _E->Y
logic _Ed, Ed;
always @*
_Ed <= #(13) _E;
always @*
Ed <= #(18) ! _E;
// combine
wire O =
(Sd==0 & Id[0]) ||
(Sd==1 & Id[1]) ||
(Sd==2 & Id[2]) ||
(Sd==3 & Id[3]) ||
(Sd==4 & Id[4]) ||
(Sd==5 & Id[5]) ||
(Sd==6 & Id[6]) ||
(Sd==7 & Id[7]);
assign Y = _Ed==0 ? O : 0;
assign _Y = Ed==1 ? !O : 1;
if (LOG) always @*
begin
$display("%9t %m ", $time, "_E=%1b I=%8b S=%1d Y=%b _Y=%b (_Ed=%b, Ed=%b)", _E, I, S, Y, _Y, _Ed, Ed);
end
endmodule