我试图找出Verilog中>>运算符的语义的细微细节。我没有在LRM或任何其他在线参考/教程资料中找到任何相关的内容。
作为一个例子,假设我想将二进制转换为格雷代码,然后再次返回。对于从二进制到灰色,这非常简单:
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);
但是,朝相反的方向有些不同。这涉及到递归关系,其中每个位的计算都取决于先前的结果:
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借来的数字
答案 0 :(得分:0)
这应该在模拟和综合中起作用。只要存在静态确定的递归数,递归就可以。