我是verilog的新手,我正在研究定义两个模块的verilg代码。 第一个模块计算2个数字的mod,第二个模块使用结果对其进行一些操作。
结果是错误的并且有很多不关心的值,因为在两个模块中使用了相同的clk。有任何建议请同步。
mod模块
module mod(m,a,b);
input [15:0] a,b;
output [15:0] m;
reg [31:0] mod;
reg [31:0] mul;
integer i;
always @* begin
mul = a*b;
mod = 32'h80008000;
for(i=0;i<16;i=i+1) begin
if(mul > mod) begin
mul = mul - mod;
mod = mod >> 1;
end
else begin
mod = mod >> 1;
end
end
assign m=mul[15:0];
endmodule
顶级模块的一部分:
initial begin
keyp <= 2'b10;
shift <= 1'b0;
end
always @(posedge clk) begin
if(load)
case (keyp)
2'b10: begin
key[127:64] <= {k1,k0};
keyp <= 2'b01;
end
2'b01: begin
key[63:0] <= {k1,k0};
keyp <= 2'b00;
shift <= 1'b1;
end
//default: keyp <=2'b00;
endcase
else if (shift) begin
//shift key for first round
temp[24:0] <= key[127:103];
key[127:25] <= key[102:0];
key [24:0] <= temp [24:0];
shift <= 1'b0;
end
end
assign w1[2*SIZE-1:SIZE] = d1+key[2*SIZE-1:SIZE];
assign w1[3*SIZE-1:2*SIZE] = d2+key[3*SIZE-1:2*SIZE];
mod mod1( w1[SIZE-1:0], d0, key[SIZE-1:0] );
mod mod2( w1[4*SIZE-1:3*SIZE], d3, key[4*SIZE-1:3*SIZE]);
答案 0 :(得分:0)
x被称为不关心casex语句或卡诺图,这里它们代表未知值。未知值可能来自未初始化(重置)或多个(冲突)驱动程序的值。
mod模块包含以下代码部分:
always @* begin
mul = a*b;
mod = 32'h80008000;
for(i=0;i<16;i=i+1) begin
if(mul > mod) begin
mul = mul - mod;
mod = mod >> 1;
end
else begin
mod = mod >> 1;
end
end
always @*
是一个组合块,你多次分配mul只有最后一个赋值会产生任何影响。
在这里使用for循环使得它看起来像是在尝试重用变量,就像在c中一样。请记住,我们正在描述硬件,并且该值旨在作为模块之间的触发器或连线存在,并且在任何给定的时钟周期内只能保存单个值。
在组合块中你有mul = mul - mod;
mul定义自己这不起作用,你需要添加一个触发器来打破循环。
答案 1 :(得分:0)
使用阻塞分配多次分配相同的值是完全有效的Verilog。即使在双方都出现相同的术语也是可以的,只要在此之前至少分配过一次。
这里的代码不完整但问题似乎是代码在多个地方分配给'key'。既作为mod实例的输出又作为时钟块的输出。任何时候这两个“不同意”关键的价值它将被视为X. X除了代表未知之外还反映了两个不同任务冲突的争论。
由于我不确定这段代码的用途(似乎是某种加密),我无法提供修复,但您需要将赋值分配给密钥。