我的Verilog代码看起来是这样的。该模块实现具有地址寄存器的查找表ROM,该地址寄存器在时钟脉冲上递增。对此输出进行解码以给出32位数。我不明白为什么k需要登记。实际上,我不希望在地址寄存器更改后k有一个时钟延迟。如何指定addr的解码?
(请注意,这似乎与同名的其他问题无关,因为我已经检查过了--我不想在输出上注册。我只想异步解码计数寄存器的输出。也许我对<=操作符感到困惑,我认为它总是会生成一个时钟寄存器,但也许我应该始终使用<=。)
module k_rom (input clk, input reset, output [31:0] k);
// Constants defined by the SHA-2 standard.
reg [5:0] addr;
always @ (addr)
begin
case(addr)
6'h00: k = 32'h428a2f98;
6'h01: k = 32'h71374491;
6'h02: k = 32'hb5c0fbcf;
6'h03: k = 32'he9b5dba5;
6'h04: k = 32'h3956c25b;
6'h05: k = 32'h59f111f1;
6'h06: k = 32'h923f82a4;
6'h07: k = 32'hab1c5ed5;
6'h08: k = 32'hd807aa98;
6'h09: k = 32'h12835b01;
6'h0a: k = 32'h243185be;
// other constants not shown for brevity
6'h3c: k = 32'h90befffa;
6'h3d: k = 32'ha4506ceb;
6'h3e: k = 32'hbef9a3f7;
6'h3f: k = 32'hc67178f2;
endcase
end
always @ (posedge clk)
begin
if(reset)
addr <= 6'b0;
else
addr <= addr + 6'b1;
end
endmodule发布于 2016-04-17 05:24:29
LHS在过程块中的赋值必须是reg类型。过程赋值语句将值赋值给reg、integer、real或time变量,而不能将值赋值给wire。请注意,reg可以根据某些触发事件保存或存储某些值,而wire不能存储任何值。
在这里,k是持有的一些值,直到addr信号发生变化。从今以后,它需要reg类型。
默认情况下,output信号是wire类型的。声明k为output reg [31:0] k。
module k_rom (input clk, input reset, output reg [31:0] k);在上面的代码中,阻塞分配(=)和非阻塞分配(<=)的使用似乎是正确的。
将阻塞分配(=)用于组合逻辑( always @(addr)块)。将非阻塞分配(<=)用于顺序逻辑( always @(posedge clk)块)。
但是,您可能更喜欢使用always @(*) (或always_comb表示SystemVerilog)而不是always @(addr)作为自动敏感列表。
参考this PDF以了解reg和wire之间的区别。
https://stackoverflow.com/questions/36672788
复制相似问题