首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Verilog根据输入在任务中强制不同的连接

Verilog根据输入在任务中强制不同的连接
EN

Stack Overflow用户
提问于 2012-07-12 00:52:16
回答 2查看 4.2K关注 0票数 2

有没有一种方法可以在Verilog任务中强制任意连接到某个特定值,而不提前指定连接的名称或其分层路径?优选地,不必为每条可能的线路编写大量的if语句。

我的目标是足够模块化,以便这个任务可以用来从testbench的角度驱动任何连接。

下面是我希望做的例子:

代码语言:javascript
运行
复制
task force;
input value;
input [8*N-1:0] string;              // Assume N is large enough
begin
    force ... = value;
end
endtask

其中的三个点“...”将是传入的连接的路径(例如counter0.clk0.in_enable)。

假设我有64根线,我想把它们中的一些放高。它们不在一条总线上,它们都有不同的名称或分层路径。在testbench设置中,我将编写一个C函数,该函数读取我希望驱动到某个特定值的连接线的表,并将每个连接线传递给这个Verilog任务,但是我如何才能告诉模拟器将哪条连接线驱动为高电平,而不必每次都在任务本身中写出每一条连接线?

如果我能做到这一点,正确的方法是什么?如果我不能做到这一点,你能给我什么建议呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 03:16:57

很可能有一种PLI/VPI方法可以做到这一点,但我对此并不是很有经验,所以对此持保留态度。我在verilog中也没有注意到任何将字符串转换为线引用的反射。

话虽如此,我所要做的就是使用脚本语言读取您的表,并生成一个带有巨大case语句的过程化生成的.v文件。

你可以有一个像force_wire(int wireId),release_wire(int wireId)这样的PLI调用,其中的连接id可以是表中的行或者其他什么。

在C例程中,您可以从字符串name中查找id,然后这将使用id调用verilog任务,id将从生成的case语句中选择要强制执行的内容。可能是这样的:

代码语言:javascript
运行
复制
task force
input forceVal;
input wireId
begin
   case (wireId)
   //AUTOGENERATED BELOW
   0 : force foo.bar = forceVal;
   1 : force foo.baz = forceVal;
   2 : force bar.foo = forceVal;
   ...
   endcase
end
票数 2
EN

Stack Overflow用户

发布于 2012-07-12 04:32:46

遗憾的是,不能,您不能使用非PLI Verilog构造来做您正在尝试的事情。强制的目标需要是网络的分层路径,并且没有办法对其使用字符串。

Tim在另一个答案中的建议是,基本上创建一个大的查找表,这可能是不使用Verilog PLI的最好方法。

如果你想使用PLI,你应该能够写一个函数,它可以接收字符串并作用力。我想做类似的事情已经有一段时间了,但还没有抽出时间去尝试。如果你找到更好的方法,请在这里回答你自己的问题。

编辑:使用PLI或SystemVerilog绑定的一些可能的实现的Here is a discussion

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11437564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档