Verilog >>运算符的语义应用于网络

时间:2019-06-03 20:13:57

标签: operators verilog semantics

我试图找出Verilog中>>运算符的语义的细微细节。我没有在LRM或任何其他在线参考/教程资料中找到任何相关的内容。

作为一个例子,假设我想将二进制转换为格雷代码,然后再次返回。对于从二进制到灰色,这非常简单:

binary to gray logic

wire [3:0] bin;
wire [3:0] gray;

assign gray[3] =          bin[3];
assign gray[2] = bin[3] ^ bin[2];
assign gray[1] = bin[2] ^ bin[1];
assign gray[0] = bin[1] ^ bin[0];

当然,分配可以减少为

assign gray = bin ^ {1'b0, bin[3:1]};

甚至只是

assign gray = bin ^ (bin >> 1);

但是,朝相反的方向有些不同。这涉及到递归关系,其中每个位的计算都取决于先前的结果:

gray to binary logic

assign bin[3] =          gray[3];
assign bin[2] = bin[3] ^ gray[2];
assign bin[1] = bin[2] ^ gray[1];
assign bin[0] = bin[1] ^ gray[0];

我可以这样写

assign bin = gray ^ {1'b0, bin[3:1]};

但是我可以走最后一步然后写

assign bin = gray ^ (bin >> 1);

显然,这在任何软件编程语言中都行不通。但是对我来说,作为硬件设计师,这些功能在它们描述的硬件连接方面完全相同。但是仿真和综合工具会以哪种方式解释它?

我将开始尝试一些模拟器以查看会发生什么,但是我希望能有一个指向权威引用的指针,即使最终引用是“未指定”或“依赖于实现”的。


here借来的数字

1 个答案:

答案 0 :(得分:0)

这应该在模拟和综合中起作用。只要存在静态确定的递归数,递归就可以。