Verilog:大型总线或合成

时间:2013-04-16 14:38:02

标签: verilog

我正在寻找公共汽车的逻辑或。

工作代码:

parameter Width = 8;
wire my_bus [Width-1:0];
wire bus_or = (my_bus[0] || my_bus[1] || ... || my_bus[Width-1])

工作正常,但完全不适合大型总线(即64位)

我见过:(来自here

wire bus_or = |my_bus;

然而,这只是抱怨错误:一元运算符'|'的非法操作数和连续分配的非法右手边。

有趣的是语法:

wire bus_or = |{my_bus[0], my_bus[1], ..., my_bus[Width-1]} 

工作正常,尽管连接创建了一个总线,原始的未拆分对象是一个开始的总线......

我们正在使用生成块来创建各种信号,线路,寄存器等,目的是扩展参数化代码。如果总线OR的语法容易出错,那似乎很遗憾。

我喜欢的东西就像wire bus_or = | my_bus;

一样简单

对不起。 非常简单的回答!!!

当总线被声明为向量时,wire bus_or = |my_bus;表示法正常工作但不是当它的数组时:here

2 个答案:

答案 0 :(得分:5)

您没有定义N位总线,而是定义1位总线的集合。

你真的想要:

parameter Width = 8;
wire [Width-1:0] my_bus ;

这应该允许以下工作。

wire bus_or = |my_bus;

注意:将常量设为大写是一种好习惯。 WIDTH而不是Width。也可以为它添加一些语义,W_DATA或W_CONTROL等。

答案 1 :(得分:0)

Morgan已正确回复,您必须以压缩数组格式定义总线,以便在整个总线上执行操作。

data_type [width-1:0]总线。 在内存中,它将被存储为
 | X | bus_width-1 | ..... | bus_1 | bus_0 |

解压缩数组用于执行按位操作 data_type总线[width-1:0] 在内存中将存储为
| X | X | bus_0 |
| X | X | bus_1 |
| X | X | bus_1 |



| X | X | bus_width-1 |