在Verilog中写环形振荡器是非常简单的。我们也知道,在现实中,无论初始状态如何,它都将可靠地工作在实际硬件中,无论是FPGA还是ASIC (如果没有优化)。
但是,没有复位电路的Verilog模型(在实际实现中不需要)将无法工作,因为它将受到未定义状态的困扰。
是否有可能抑制未定义的状态并使其在Verilog中可靠工作,而不进行更复杂的物理实现(即不添加重置)?我正在模拟Icarus,而硅的实现是开放的。
在这里,我尝试使用SystemVerilog位类型并预设初始值--但这一切都不起作用。我在模拟中仍然有旋转的X态。Shifter[]有1s-确保它没有被优化掉。
wire bit c1_1 = 0;
wire bit c1_2 = 0;
wire bit c1_3 = 0;
assign #10 c1_1 = c1_3 ^ shifter[0];
assign #11 c1_2 = c1_1 ^ shifter[1];
assign #12 c1_3 = c1_2 ^ shifter[2];
发布于 2022-09-04 02:45:56
在verilog中,类似于wire bit c1_1 = 0;
的语句等价于
wire bit c1_1;
assign c1_1 = 0;
因此,本质上,您使用两个驱动程序驱动c1_1,如果值不同,则会将'x‘值赋值给它。
另外,由于使用延迟,您创建的驱动程序肯定无法综合。你应该用钟代替。但是..。对于不可综合的代码,您可以轻松切换到寄存器并使用初始块,如下所示:
reg r1, r2, r3;
wire c1_1, c1_2, c1_3;
initial begin
r3 = 0; // initialize r3, assuming that shifter becomes non-x until first #10
forever begin
#10 r1 = r3 ^ shifter[0];
#11 r2 = r1 ^ shifter[1];
#12 r3 = r2 ^ shifter[2];
end
end
assign c1_1 = r1, c1_2 = r2, c1_3 = r3;
假设移位器不是“x”,在时间10,它应该生成非“x”值。
https://stackoverflow.com/questions/73593235
复制相似问题