题解 | #位拆分与运算#
位拆分与运算
https://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752
`timescale 1ns/1ns module data_cal( input clk, input rst, input [15:0]d, input [1:0]sel, output [4:0]out, output validout ); //*************code***********// reg [4:0] out; reg validout; reg [15:0] d_vld; always @(posedge clk or negedge rst)begin if(rst == 1'b0) out <= 5'd0; else begin case(sel) 2'd0: out <= 5'd0; 2'd1: out <= d_vld[3:0] + d_vld[7:4]; 2'd2: out <= d_vld[3:0] + d_vld[11:8]; 2'd3: out <= d_vld[3:0] + d_vld[15:12]; endcase end end always @(posedge clk or negedge rst)begin if(rst == 1'b0) validout <= 1'd0; else begin case(sel) 2'd0: validout <= 0; 2'd1: validout <= 1; 2'd2: validout <= 1; 2'd3: validout <= 1; endcase end end always @(posedge clk or negedge rst)begin if(rst == 1'b0) d_vld <= 5'd0; else begin case(sel) 2'd0: d_vld <= d; 2'd1: d_vld <= d_vld; 2'd2: d_vld <= d_vld; 2'd3: d_vld <= d_vld; endcase end end //*************code***********// endmodule 测试文件 `timescale 1ns/1ns module testbench(); reg clk ; reg rst ; reg [15:0] d ; reg [1:0] sel ; wire [4:0] out; wire validout ; data_cal data_cal_inst( .clk (clk ), .rst (rst ), .d (d ), .sel (sel ), .out (out ), .validout (validout) ); initial clk = 1; always #5 clk = ~clk; initial begin rst = 1'b0; #11; rst = 1'b1; end initial begin sel = 2'd0; #30; sel = 2'd2; #30; sel = 2'd1; #30; sel = 2'd0; #10; sel = 2'd3; end initial begin d = 16'd0; #20; d = 16'b1000010000100001; #40; d = 16'b1000010000100011; #50; d = 1000010000100111; end always begin #100; if($time >= 1000) $finish; end initial begin $dumpfile("out.vcd"); // This will dump all signal, which may not be useful //$dumpvars; // dumping only this module //$dumpvars(1, testbench); // dumping only these variable // the first number (level) is actually useless $dumpvars(0, testbench); end endmodule